如何解析小数点分隔符为冒号的数字的字符串表示形式:

How to parse string representation of number where decimal separator is colon :

我在 C++ 程序中使用 ICU 从可能包含十进制值的各种区域设置和应用程序特定表示的文本中解析十进制值。代码的第一层应用正则表达式来放大文本中的相关部分,然后我需要取消格式化(在本例中)包含十进制值的字符串。

在配置中我们可以设置语言环境(例如"en"、"sv")和应该应用的ICU 十进制格式。例如,"en" 和格式###,###.## 将使用以下代码解析美国英语样式数字“123,456.70”(省略错误处理):

UErrorCode error = U_ZERO_ERROR;
icu::Formattable binvalue( 0.0 );
icu::Locale iculocale( locale_as_string ); // e.g "sv", "en"
icu::DecimalFormatSymbols symbols( iculocale, error );
icu::DecimalFormat format( pattern, symbols, error ); // pattern as "###,###.##"
format.parse( value, binvalue, error );

现在我需要解析显然具有自定义格式的输入字符串 123:70。我无法控制生成文件的应用程序。输入文档的语言环境是 "sv"(瑞典语),但这可能并不重要。

是否可以通过指定语言环境和 ICU 数字模式来完成这项工作,例如 ###,###':'##(显然不是正确的例子)。在我的应用程序的 UI 中,我(现在)只能设置模式和语言环境。所以我没有办法自定义 DecimalFormatSymbols。

不幸的是,除了 DecimalFormat

之外,我没有发现其他关于 ICU 十进制格式的有趣内容

简而言之,我可以通过模式字符串覆盖小数分隔符吗?是否有模式和语言环境组合可以解析“123:70”和 return 我的十进制值 123.7?

您的符号对象有一个方法 setSymbol,您可能想调用它。

symbols.setSymbol(icu::DecimalFormatSymbols::kDecimalSeparatorSymbol, ':');

格式字符串不特定于语言环境,因此您可以继续使用模式 ###,###.##