【问题标题】:Convert part of string to double with regex使用正则表达式将部分字符串转换为双精度
【发布时间】:2013-05-24 22:55:52
【问题描述】:

我的应用程序似乎因“错误格式”而崩溃,我有这个:

Match m = Regex.Match(value, "[0-9]+[.[0-9]+]?");
double number = Convert.ToDouble(m.Value);
return number;

重点是将这样的字符串值:114.6W, 120.6W. 转换为我可以排序的值。 我编写的函数假设将任何字符串转换为 9999.9999 双精度值,但它在Convert.ToDouble() 上崩溃。输入格式错误?

【问题讨论】:

  • 为什么不能对“114.6W”和“120.6W”进行排序?
  • 我想我可以,但我想把它变成一个数值然后排序..
  • @paul the string "114" is < "14" and < "24",因此如果 OP 确实需要按值排序,则不能简单地按字符串排序。
  • @Link 是的,我假设前导零
  • 请查看this answer 了解我编辑您的标题的原因。

标签: c# regex string double type-conversion


【解决方案1】:

也许. 不是您使用的区域性的小数分隔符。解析时尝试指定InvariantCulture

double number = Convert.ToDouble(m.Value, CultureInfo.InvariantCulture);

【讨论】:

    【解决方案2】:

    问题在于您的正则表达式:它应该是

    [0-9]+(\.[0-9]+)?
    

    [.[0.9]+](我对它的解析感到惊讶)是一个字符类,用于查找以下集合中的任何字符:点、开始和结束括号、0 到 9 或加号。

    【讨论】:

    • 在 C# 中,我得到“无法识别的转义字符”。正则表达式让我头疼
    • 用什么?您的原始正则表达式还是建议的正则表达式?
    【解决方案3】:

    你必须用括号替换方括号

    Match m = Regex.Match(value, @"[0-9]+(?:\.[0-9]+)?");
    

    【讨论】:

      【解决方案4】:

      如果保证始终是十进制数后跟单个字母,那么:

      var word = "120.6W";
      var d = Decimal.Parse(word.Substring(0,word.Length-1));
      

      【讨论】:

        【解决方案5】:

        试试这两个正则表达式,你可能需要测试和调整你的需要

        这个会抓取所有数字,包括.,但前提是后面跟着一个W(不会抓取w)

        (?i)\d+\.\d+(?=w)
        

        无论后面是什么,这个都会抓取所有数字

        \d+\.\d+
        

        或者,如果您的数据集仅包含数字加一个字母,前后均无任何内容,请按照@paul 的建议进行操作,只需去掉最后一个字符

        【讨论】:

        • 当心,有一个陷阱:.NET 中的\d 将匹配任何 UTF-8 数字。不限于0-9。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多