解析测量单位

时间:2012-02-16 15:26:16

标签: c# regex parsing

我有以下字符串:

string value = "123.456L";

将此字符串解析为字符串和double的最佳方法是什么:

double number = 123.456;
string measure = "L"

我们还可以拥有其他内容,例如ozm/sliterkilograms

7 个答案:

答案 0 :(得分:8)

假设度量单位始终表示为字符串后面的单个字符,您可以这样做:

string value = "123.456L";
var pos = value.LastIndexOfAny("0123456789".ToCharArray());
double number = double.Parse(value.Substring(0, pos+1));
string measure = value.Substring(pos+1);

答案 1 :(得分:5)

根据解释输入的评论,我会使用正则表达式。

double number = double.Parse(Regex.Match(value, @"[\d.]+").Value);
string measure = value.Replace(number.ToString(), "");

正则表达式[\d.]将匹配任意数字或.+表示必须为1个或多个匹配。

答案 2 :(得分:1)

我会这样做:

public bool TryParseUnit ( string sValue, out double fValue, out string sUnit )
{
    fValue = 0;
    sUnit = null;

    if ( !String.IsNullOrEmpty ( sValue ) )
    {
        sUnit = GetUnit ( sValue );

        if ( sUnit != null )
        {
            return ( Double.TryParse ( sValue.Substring ( sValue.Length - sUnit.Length ),
                out fValue );
        }
    }

    return ( false );
}

private string GetUnit ( string sValue )
{
    string sValue = sValue.SubString ( sValue.Length - 1 );

    switch ( sValue.ToLower () )
    {
        case "l":
            return ( "L" );
    }

    return ( null );
}

我知道它比其他答案更复杂,但这样你也可以在解析过程中验证数据并丢弃无效输入。

答案 3 :(得分:1)

你可以使用正则表达式

        using System.Text.RegularExpression;
        Regex reg = new Regex(@"([\d|\.]*)(\w*)");
        string value = "123.4L";
        MatchCollection matches = reg.Matches(value);
        foreach (Match match in matches)
        {
            if (match.Success)
            {

                GroupCollection groups = match.Groups;
                Console.WriteLine(groups[1].Value); // will be 123.4
                Console.WriteLine(groups[2].Value); // will be L

            }
        }

那么这将做的是寻找0或更多数字或“。”然后将它们分组,然后查找任何字符(0或更多)。然后,您可以从每个匹配中获取组并获取值。如果您想要更改测量类型,这将起作用,如果您没有小数点也可以。


编辑:请务必注意,必须将组[1]用于第一组,将组[2]用于第二组。如果您使用组[0],它将显示原始字符串。

答案 4 :(得分:1)

您可能需要查看GitHubNuGet上的Units.NET。它支持解析不同文化中的缩写,但仍然在我的TODO list上添加对解析数字和单位组合的支持。我已经在相关项目中完成了这项工作,因此应该直接添加。

2015年4月更新:现在,您可以按Length.Parse("5.3 m");分析单位和值,并为其他单位解析类似内容。

答案 5 :(得分:0)

简单地说:寻找0..9或者所有字符。并将它们修剪为一个新的字符串,然后将最后一部分放在第二个字符串中我可以在一分钟内给出代码。

编辑:是的,我的意思是数字0-9,更正了它。但是更容易获得最后一个数字的索引,并在修剪之前忽略它们。

答案 6 :(得分:0)

你可以试试这个:

string ma = Regex.Match(name, @"((\d\s)|(\d+\s)|(\d+)|(\d+\.\d+\s))(g\s|kg\s|ml\s)").Value;

这将匹配:

40g,40g,12.5g,1kg,2kg,150ml ....