c# - 将带有 '$' 的字符串值转换为 double

标签 c# type-conversion

还没有在 SO 上找到类似的问题(关于 '$')。

我正在关注 this example ,试图扩展一个预先存在的方法来将字符串转换为 double 。代码的一般结构如下所示:

string str = "$1,000.00";
double output;
var success = Double.TryParse(
    str
    , NumberStyles.AllowLeadingWhite
        | NumberStyles.AllowTrailingWhite
        | NumberStyles.AllowLeadingSign
        | NumberStyles.AllowDecimalPoint
        | NumberStyles.AllowThousands
        | NumberStyles.AllowExponent
        | NumberStyles.AllowCurrencySymbol
    , null // CultureInfo.InvariantCulture
           // or NumberFormatInfo.InvariantInfo break conversion with '$'..
    , out output
    );
Console.WriteLine("'{0}' --> {1}, {2}", str, output, success);

这行得通。我遇到的问题是在 IFormatProvider parameter 时处理“$”字符Double.TryParse() 方法设置为 CultureInfo.InvariantCultureNumberFormatInfo.InvariantInfo

(即用注释掉的变量之一替换方法调用中的 null)

这是为什么呢?我真的需要将该参数设置为适合输入字符串国际化的参数之一吗?此方法的初始实现将参数设置为 NumberFormatInfo.InvariantInfo,这会中断包含“$”的字符串的转换。

最佳答案

这是为什么?

不变文化的货币符号是 ¤,它不是美元符号。这就是它失败的原因。

但是,您不需要修改必须考虑到这一点的转换代码 - 但您可以修改传入的字符串。

static string ReplaceCurrency(string str) 
{
    return Regex.Replace(str, @"\p{Sc}", "¤");
}

这会将任何货币符号替换为不变符号 - 这将正确解析。

string str = "$1,000.00";
double output;
var success = Double.TryParse(ReplaceCurrency(str), 
    NumberStyles.Currency, 
    CultureInfo.InvariantCulture, 
    out output);
Console.WriteLine(output);

输出

1000

关于c# - 将带有 '$' 的字符串值转换为 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31466452/

相关文章:

c# - LINQ导致无效的类型转换吗?

c# - 如何像 CSS 附加示例中那样设置 WPF 按钮样式

c# - 多实例 COM 对象

c# - 如何修复 'cannot open shared object file: No such file or directory' 错误?

java - 您好,我尝试将数据库中的字符串值转换为 int,但没有发生

c# - 即使签名匹配,也无法将一种类型的委托(delegate)分配给另一种

c# - Visual Studio 2015 中的类库项目

c# - 添加参数的两种情况有什么区别?

c++ - 总是使用构造函数而不是显式转换运算符

php - 当类型提示时,像在 JAVA 中一样使用包装类