Как обрабатывать числовые строки с различными десятичными символами, такими как запятая вместо точки в VB.Net? - PullRequest
0 голосов
/ 27 ноября 2018

У нас есть много программ VB.net (все годы), которые были написаны для клиентов из США.Теперь мы получаем международных клиентов, которые используют точку (точку) в качестве десятичного разделителя вместо запятой (то есть запятая отделяет доллары от центов, а точка отделяет 3 десятичных знака).

Мы можем получить десятичный разделительСимвол из реестра здесь:

HKEY_CURRENT_USER, "Control Panel\International", "sShortDate" 

Итак, мы знаем, что это такое.Проблема связана с различными функциями VB.Для данной строки с использованием разделителя запятых:

s = "1.234,56"

Это допустимая числовая строка, где IsNumeric(s) возвращает true, но Val(s) возвращает 1 вместо 1234.56.cDBL(s) правильно возвращает 1234.56.

С сотнями Val и IsNumeric во всех наших приложениях у нас есть все виды проблем с конвертацией.Как мы можем правильно проанализировать эти значения?

Выше было использование Visual Studio 2010.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Val() и IsNumeric() существуют только для обратной совместимости со старым кодом vb6-эры.Вы не должны действительно использовать их в новых приложениях.(Оператор CDbl() и аналогичные на самом деле являются операторами, хотя они имеют семантику функций и все еще в порядке, хотя я лично склоняюсь к семейству функций Convert.ToX()).

Вместо этого используйте более новые.Чистые API: Integer.Parse(), Integer.TryParse(), Integer.ParseExact() и Integer.TryParseExact().Это семейство функций доступно для всех встроенных числовых типов (Integer, Double, Decimal, Long, ULong и т. Д.).Особенно обратите внимание на функции с «Точным» в названии, которые позволяют указывать ожидаемые форматы входной строки, а также объект, указывающий культуру для использования в качестве десятичного разделителя.

0 голосов
/ 27 ноября 2018

Вместо сочетания IsNumeric () и Val () вы можете использовать Double.TryParse и методы TryParse для других числовых типов, которым вы можете предоставить информацию о культуре для использования при разборечисло.

Вы можете использовать свойство CultureInfo.CurrentUICulture , чтобы получить информацию о культуре для использования.

...