Разбор единиц измерения - PullRequest
3 голосов
/ 16 февраля 2012

У меня есть следующая строка:

string value = "123.456L";

Каков наилучший способ разбить эту строку на строку и двойное:

double number = 123.456;
string measure = "L"

Вместо L у нас также может быть что-то еще, например oz, m/s, liter, kilograms и т. Д.

Ответы [ 7 ]

8 голосов
/ 16 февраля 2012

Предполагая, что единицы измерения всегда выражаются как один символ в конце строки, вы можете сделать это:

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);
5 голосов
/ 16 февраля 2012

Исходя из комментария, объясняющего ввод, я бы использовал Regex.

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

Регулярное выражение [\d.] будет соответствовать любому числу или ., + означает, что оно должно быть для 1 или более совпадений.

1 голос
/ 15 мая 2014

Возможно, вы захотите взглянуть на Units.NET на GitHub и NuGet .Он поддерживает разбор аббревиатур в разных культурах, но он все еще в моем списке TODO , чтобы добавить поддержку парсинга комбинаций чисел и единиц.Я уже сделал это в связанном проекте, поэтому добавить его просто.

Обновление апрель 2015: Теперь вы можете анализировать единицы и значения по Length.Parse("5.3 m");другие подразделения.

1 голос
/ 16 февраля 2012

Вы можете сделать это с помощью регулярного выражения

        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], она отобразит исходную строку.

1 голос
/ 16 февраля 2012

Я бы сделал это так:

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

Я знаю, что это сложнее, чем другие ответы, но таким образом вы также можете проверять данные во время анализа и отбрасывать неверный ввод.

0 голосов
/ 12 апреля 2014

Вы можете попробовать это:

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 мл ....

0 голосов
/ 16 февраля 2012

Проще говоря: ищите все символы, которые являются 0,9 или. и обрезать их до новой строки, затем последняя часть во второй строке. Через минуту я не могу дать код.

Редактировать: Да, я имел в виду цифры 0-9, исправил это. Но проще получить индекс последнего номера и игнорировать материал перед обрезкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...