Как напечатать число с запятыми в качестве разделителей тысяч?

Для строк без пробела мы можем использовать приведенный ниже код

private static void findRecurrence(String input) {
    final Map<String, Integer> map = new LinkedHashMap<>();
    for(int i=0; i<input.length(); ) {
        int pointer = i;
        int startPointer = i;
        boolean pointerHasIncreased = false;
        for(int j=0; j<startPointer; j++){
            if(pointer<input.length() && input.charAt(j)==input.charAt(pointer) && input.charAt(j)!=32){
                pointer++;
                pointerHasIncreased = true;
            }else{
                if(pointerHasIncreased){
                    break;
                }
            }
        }
        if(pointer - startPointer >= 2) {
            String word = input.substring(startPointer, pointer);
            if(map.containsKey(word)){
                map.put(word, map.get(word)+1);
            }else{
                map.put(word, 1);
            }
            i=pointer;
        }else{
            i++;
        }
    }
    for(Map.Entry<String, Integer> entry : map.entrySet()){
        System.out.println(entry.getKey() + " = " + (entry.getValue()+1));
    }
}

. Передача некоторого ввода как «hahaha» или «ba na na» или «xxxyyyzzzxxxzzz» дает желаемый результат.

610
задан Acumenus 29 June 2019 в 11:34
поделиться

5 ответов

Универсальное решение

я нашел некоторые проблемы с точечным разделителем в предыдущей вершине проголосовавшими ответами. Я разработал универсальное решение, где можно использовать то, что Вы хотите как тысяча разделителей, не изменяя локаль . Я знаю, что это не самое изящное решение, но это сделало задание. Не стесняйтесь улучшать его!

def format_integer(number, thousand_separator='.'):
    def reverse(string):
        string = "".join(reversed(string))
        return string

    s = reverse(str(number))
    count = 0
    result = ''
    for char in s:
        count = count + 1
        if count % 3 == 0:
            if len(s) == count:
                result = char + result
            else:
                result = thousand_separator + char + result
        else:
            result = char + result
    return result


print(format_integer(50))
# 50
print(format_integer(500))
# 500
print(format_integer(50000))
# 50.000
print(format_integer(50000000))
# 50.000.000
0
ответ дан 22 November 2019 в 21:44
поделиться

Просто подкласс long (или float , или что-то еще). Это очень практично, потому что таким образом вы все еще можете использовать свои числа в математических операциях (и, следовательно, существующий код), но все они будут хорошо печататься в вашем терминале.

>>> class number(long):

        def __init__(self, value):
            self = value

        def __repr__(self):
            s = str(self)
            l = [x for x in s if x in '1234567890']
            for x in reversed(range(len(s)-1)[::3]):
                l.insert(-x, ',')
            l = ''.join(l[1:])
            return ('-'+l if self < 0 else l) 

>>> number(-100000)
-100,000
>>> number(-100)
-100
>>> number(-12345)
-12,345
>>> number(928374)
928,374
>>> 345
-1
ответ дан 22 November 2019 в 21:44
поделиться

Я уверен, что для этого должна быть стандартная библиотечная функция, но было интересно попробовать чтобы написать это сам, используя рекурсию, так вот

11
ответ дан 22 November 2019 в 21:44
поделиться

Вот код группировки локали после удаления ненужных частей и небольшой очистки:

(Следующее работает только для целых чисел)

def group(number):
    s = '%d' % number
    groups = []
    while s and s[-1].isdigit():
        groups.append(s[-3:])
        s = s[:-3]
    return s + ','.join(reversed(groups))

>>> group(-23432432434.34)
'-23,432,432,434'

Здесь уже есть несколько хороших ответов. Я просто хочу добавить это на будущее. В python 2.7 будет спецификатор формата для разделителя тысяч. Согласно документам python это работает так

>>> '{:20,.2f}'.format(f)
'18,446,744,073,709,551,616.00'

В python3.1 вы можете сделать то же самое, например:

>>> format(1234567, ',d')
'1,234,567'
93
ответ дан 22 November 2019 в 21:44
поделиться

Вот это работает:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'en_US')
'en_US'
>>> locale.format("%d", 1255000, grouping=True)
'1,255,000'

Конечно, вам не нужна поддержка интернационализации, но она ясна, лаконична и использует встроенную библиотеку.

PS Этот "% d" является обычным средством форматирования в стиле%. У вас может быть только один форматтер, но он может быть любым, что вам нужно с точки зрения ширины поля и настроек точности.

PPS Если вы не можете заставить работать локаль , я бы предложил модифицированную версию ответа Марка:

def intWithCommas(x):
    if type(x) not in [type(0), type(0L)]:
        raise TypeError("Parameter must be an integer.")
    if x < 0:
        return '-' + intWithCommas(-x)
    result = ''
    while x >= 1000:
        x, r = divmod(x, 1000)
        result = ",%03d%s" % (r, result)
    return "%d%s" % (x, result)

Рекурсия полезна для отрицательного случая, но одна рекурсия на запятую кажется мне немного чрезмерной.

282
ответ дан 22 November 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: