Независимая от локали строка для преобразования с плавающей запятой в python

Мне нужно преобразовать строку в число с плавающей запятой, но могут быть разные форматы входной строки, такие как '1234,5' или '1234.5' или '1 234,5' или '1,234.5' или что-то еще. И я не могу изменить десятичный указатель локали или разделитель тысяч, потому что я могу заранее не знать, какие данные я получу.

Есть ли способ, метод или библиотека для анализа и преобразования в плавающие значения, зависящие от локали, без знания того, какая локаль используется?

P.S. Существует ли какое-либо решение для той же проблемы с датами?

ТИА.


person gorodechnyj    schedule 24.04.2012    source источник
comment
Всегда ли строки имеют какой-либо десятичный разделитель?   -  person fraxel    schedule 24.04.2012
comment
Должны, но могут и не   -  person gorodechnyj    schedule 24.04.2012
comment
хорошо, может быть больше двух знаков после запятой?   -  person fraxel    schedule 24.04.2012
comment
Если это так, то ваша проблема не может быть решена, так как всегда могут быть неоднозначные случаи. Никакая библиотека вам в этом не поможет! Лучшее, что вы можете сделать, это преобразовать все четкие случаи и сообщить о неоднозначных случаях с возможными вариантами того, каким может быть число. Т.е. 1,234 неоднозначен и может быть 1234.00 или 1.234   -  person fraxel    schedule 25.04.2012
comment
Хм, я подумаю над тем, чтобы предложить минимум допустимых вариантов, спасибо.   -  person gorodechnyj    schedule 25.04.2012
comment
Отлично. После того, как вы сузите это и удалите неоднозначные случаи, это должно быть относительно легко решить.   -  person fraxel    schedule 25.04.2012
comment
Связано: stackoverflow.com/questions/13362121/   -  person Ashwini Chaudhary    schedule 13.11.2012


Ответы (1)


Вы можете сделать некоторые предположения о том, какой символ является разделителем тысяч, а какой — десятичной точкой. Однако есть случай, когда вы не можете точно знать, что делать:

  • Найдите последний символ . или ,. Если это происходит более одного раза, число не имеет десятичной точки, и этот символ является разделителем тысяч.
  • Если строка содержит ровно по одному экземпляру каждого из них, последним является десятичная точка.
  • Если строка содержит только одну точку/запятую, вам не повезло: 123.456 или 123,456 может быть числом 123456 или 123.456. Однако с таким числом, как 123.45, т.е. количество цифр после потенциального разделителя тысяч, не кратное трем, можно предположить, что это десятичная точка.
person ThiefMaster    schedule 24.04.2012
comment
Я не хочу сам проводить эвристический анализ текста, потому что это может привести к непредсказуемым результатам. Если для этого есть библиотека, это будет мой вариант. - person gorodechnyj; 24.04.2012