正在分析度量单位

本文关键字:度量 单位 | 更新日期: 2023-09-27 18:24:46

我有以下字符串:

string value = "123.456L";

将这个字符串解析为字符串和双字符串的最佳方法是什么:

double number = 123.456;
string measure = "L"

代替L,我们还可以有其他东西,如ozm/sliterkilograms

正在分析度量单位

假设度量单位始终表示为字符串后面的单个字符,则可以执行以下操作:

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);

根据解释输入的注释,我将使用Regex。

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

正则表达式['d.]将匹配任何数字或.+表示它必须用于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 );
}

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

您可以使用regex

        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],它将显示原始字符串。

您可能想看看GitHub和NuGet上的Units.NET。它支持解析不同文化中的缩写,但它仍然在我的TODO列表中,以添加对解析数字和单位组合的支持。我已经在一个相关的项目上做了这件事,所以应该直接添加。

2015年4月更新:您现在可以通过Length.Parse("5.3 m");和其他单元的类似方法解析单元和值。

简单来说:查找0..9或。把它们修剪成一根新的绳子,然后把最后一部分放在第二根绳子上。一分钟后我就不能给出代码了。

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

你可以试试这个:

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

这将匹配:

40克、40克、12.5克、1公斤、2公斤、150毫升。。。。