Немецкие разделители чисел, использующие язык формата OSX?

Обновление: ответы пока показывают, что это похоже на связанную с платформой ошибку в OSX, которая связана с конкретными настройками локали, поскольку они не полностью поддерживают группировку чисел.

Обновление 2: я только что открыл проблему в Pugon's tracker. Посмотрим, есть ли решение этой проблемы.


Я хочу форматировать целочисленные и плавающие числа в соответствии с немецким соглашением о нумерации. Это возможно с использованием языка форматирования и типа представления n но сбой на моей платформе.

  • Платформа: OS X 10.8.2 (Горный лев)
  • Python: 2.7.3 64-бит (v2.7.3:70274d53c1dd, Apr 9 2012, 20:52:43) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin

Примеры:

  • 1234 => 1.234
  • 1234.56 => 1.234,56
  • 1000000 => 1.000.000

То, что я пробовал до сих пор:

  1. Настройка немецкого языка

     import locale locale.setlocale(locale.LC_ALL, 'de_DE') 
  2. Опция спецификации формата распознает только английский формат.

     '{:,}'.format(1234) '1,234' '{:,}'.format(1234.56) '1,234.56' '{:,}'.format(1000000) '1,000,000' 
  3. Согласно документам Python , тип представления integer и float n должен делать то, что я хочу, но это не так.

      '{:n}'.format(1234) '1234' '{:n}'.format(1234.56) '1234,56' # at least the comma was set correctly here '{:n}'.format(1000000) '1000000' '{:n}'.format(12345769.56) '1,23458e+07' # it's doing weird things for large floats 
  4. Еще несколько примеров и сравнений, вдохновленных @JFSebastian:

     for n in [1234, 1234.56, 1000000, 12345769.56]: print('{0:,} {0:n}'.format(n)) fmt, val = "%d %f", (n, n) print(fmt % val) print(locale.format_string(fmt, val)) print(locale.format_string(fmt, val, grouping=True)) print('-'*60) 

    Это дает следующие неправильные результаты на моей платформе:

      1,234 1234 1234 1234.000000 1234 1234,000000 1234 1234,000000 ------------------------------------------------------------ 1,234.56 1234,56 1234 1234.560000 1234 1234,560000 1234 1234,560000 ------------------------------------------------------------ 1,000,000 1000000 1000000 1000000.000000 1000000 1000000,000000 1000000 1000000,000000 ------------------------------------------------------------ 12,345,769.56 1,23458e+07 12345769 12345769.560000 12345769 12345769,560000 12345769 12345769,560000 ------------------------------------------------------------ 

    Правильные результаты, которые я не получаю, выглядят так:

      1,234 1.234 1234 1234.000000 1234 1234,000000 1.234 1.234,000000 ------------------------------------------------------------ 1,234.56 1.234,56 1234 1234.560000 1234 1234,560000 1.234 1.234,560000 ------------------------------------------------------------ 1,000,000 1.000.000 1000000 1000000.000000 1000000 1000000,000000 1.000.000 1.000.000,000000 ------------------------------------------------------------ 12,345,769.56 1,23458e+07 12345769 12345769.560000 12345769 12345769,560000 12.345.769 12.345.769,560000 ------------------------------------------------------------ 

У вас есть решение для меня, используя только язык формата? Есть ли способ обмануть настройки языка на моей платформе, чтобы принять группировку?

4 Solutions collect form web for “Немецкие разделители чисел, использующие язык формата OSX?”

Супер уродливый, но технически отвечает на вопрос:

От PEP 378 :

 '{:,}'.format(1234.56).replace(",", "X").replace(".", ",").replace("X", ".") '1.234,56' 

Это работало для меня при использовании с немецким языком:

 >>> import locale >>> locale.setlocale(locale.LC_ALL, 'de_DE') 'de_DE' >>> '{0:n}'.format(1234.56) '1.234,56' 

Это в Cygwin под Windows 7:

 >>> import sys >>> print sys.version 2.6.5 (r265:79063, Jun 12 2010, 17:07:01) [GCC 4.3.4 20090804 (release) 1] 

Реализация locale модуля Python, к сожалению, немного отличается от разных платформ. На самом деле это просто легкая обертка вокруг представления о локаторах поставщика библиотеки C.

Итак, в Windows 7 с 64-разрядным Python 2.7.3 это происходит, чтобы работать (обратите внимание: у локалей разные имена в Windows ):

 >>> import locale >>> locale.setlocale(locale.LC_ALL, 'deu_deu') 'German_Germany.1252' >>> '{0:n}'.format(1234.56) '1.234,56' 

Будет ли использоваться разделитель тысяч, может быть определено путем изучения «местных соглашений» :

 >>> locale.localeconv()['grouping'] # On Windows, 'deu_deu'. [3, 0] # Insert separator every three digits. >>> locale.localeconv()['grouping'] # On OS X, 'de_DE'. [127] # No separator (locale.CHAR_MAX == 127). >>> locale.localeconv()['grouping'] # Default C locale. [] # Also no separator. 

Я попросил @Lattyware предоставить мое собственное решение для включения разделителей в соответствии с немецким соглашением о нумерации без использования языка форматирования. Вот лучшее решение, которое я могу придумать:

 import re def group_num(num): if isinstance(num, (int, float)): if isinstance(num, float): head, tail = str(num).split('.') elif isinstance(num, int): head, tail = str(num), '' digit_parts = re.findall(r'\d{1,3}\-?', ''.join(head[::-1])) num = '.'.join(part[::-1] for part in digit_parts[::-1]) if tail: num = ','.join((num, tail)) return num else: raise TypeError(num, 'is not of type int or float') >>> group_num(1234) '1.234' >>> group_num(123456.7890) '123.456,789' >>> group_num(-1000000000.12) '-1.000.000.000,12' 

Производительность также вполне приемлема, по сравнению с решением, данным @ Jon-Eric.

 %timeit group_num(1000000000.12) 10000 loops, best of 3: 20.6 us per loop # For integers, it's faster since several steps are not necessary %timeit group_num(100000000012) 100000 loops, best of 3: 18.2 us per loop %timeit '{:,}'.format(1000000000.12).replace(",", "X").replace(".", ",").replace("X", ".") 100000 loops, best of 3: 2.63 us per loop %timeit '{:,}'.format(100000000012).replace(",", "X").replace(".", ",").replace("X", ".") 100000 loops, best of 3: 2.01 us per loop 

Если вы знаете, как мое решение может быть оптимизировано, сообщите мне.

  • Установка PIL на OSX Mountain Lion для движка Google,
  • Pycrypto устанавливает фатальную ошибку: gmp.h файл не найден
  • Проблема PyCuda / Multiprocessing на OS X 10.8
  • Запуск wxPython 2.9 на OS X 10.8 (64 бит)
  • Обновление Mountain Lion и библиотек python
  • На самом деле слишком много установок Python на OSX Mountain Lion
  • Могу ли я использовать распознавание / диктовку OS X 10.8 без графического интерфейса?
  • Установка Numpy на Mac 10.8.2
  • pjsua: невозможно импортировать python python module
  • Установка PyGame на ОС Mountain Lion
  • Ошибка при установке Pygame на Mountain Lion
  •  
    Interesting Posts for Van-Lav

    Почему конкатенация DataFrames экспоненциально медленнее?

    Выход для каждой ячейки для поточных IPython ноутбуков

    Идиома Python для применения функции только тогда, когда значение не равно None

    if / else, принимающие строки как в заглавных, так и в строчных буквах в python

    Python – алгоритм находит временные интервалы

    стек бар в matplotlib и добавить метку к каждому разделу (и предложения)

    Django filter query с полями автоматически вычисляются

    Операция импорта внутри определения класса / функции – это хорошая идея?

    Два отдельных списков python, действующих как один

    как получить кадры из видео параллельно с использованием cv2 и многопроцессорности в python

    Имя переменной в sqlite

    Есть ли эквивалент python утилиты unix «file»?

    Какие части API PyPI фактически используются клиентами?

    Сравнение производительности MongoDB и RethinkDB Bulk Insert

    Должен ли я использовать HttpResponseRedirect здесь?

    Python - лучший язык программирования в мире.