C # строка с определенным символом в конце целого числа - PullRequest
4 голосов
/ 20 декабря 2011

Вероятно, я мог бы сделать это в несколько шагов, посмотрев на последний символ строки и основываясь на том, что он посылает в определенную функцию для выполнения преобразования.Но мне просто интересно, есть ли какой-нибудь более простой способ сделать следующее.

Например, у меня есть строка, которая может сказать что-то вроде 23.44M или 5.23B, M и B, очевидно, означают «Миллион» или«Миллиард», я хочу преобразовать эту строку в число, которое она представляет, но просто не уверен в наиболее эффективном способе сделать это.Ищу некоторые идеи.Спасибо

Ответы [ 6 ]

6 голосов
/ 20 декабря 2011

Я бы создал словарь и заполнил его парами ключ-значение, такими как (B, 1 000 000 000) и (M, 1 000 000).Снимите символ с конца, найдите значение этого символа и умножьте.

1 голос
/ 20 декабря 2011

Что-то в этом духе работает для вас?

double num = Double.parse(inputStr.Remove(inputStr.Count-1));
char lastChar = inputStr.Last();
switch(lastChar)
{
   case 'M':
      num *= 1000000;
      break;
   case 'B':
      num *= 1000000000;
      break;
}

Если формат вашего ввода может варьироваться, вам придется добавить дополнительную логику, в том числе защиту от недопустимого Parse ().

0 голосов
/ 30 декабря 2011

Используйте словарь для сопоставления символов с множителями вместо оператора switch и используйте только верхний регистр:

public static decimal GetValue(string number)
{
    return decimal.Parse(number.Remove(number.Length - 1, 1)) *  _multipliers[number.Last().ToUpper()];
}
0 голосов
/ 20 декабря 2011

В качестве альтернативы ответу @Smelch вы можете заполнить строковую константу POSTFIXES, например "xHKxxMxxBxxTxxQ", и умножить свою базу на Math.Pow (10, POSTFIXES.LastIndexOf (...) + 1)

0 голосов
/ 20 декабря 2011
/// <summary>
/// Gets the value.
/// </summary>
/// <param name="number">The number.</param>
/// <returns></returns>
public static decimal GetValue(string number)
{
    char unit = number.Last();
    string num = number.Remove(number.Length - 1, 1);

    decimal multiplier;
    switch (unit)
    {
        case 'M':
        case 'm':
            multiplier = 1000000; break;

        default:
            multiplier = 1; break;
    }

    return decimal.Parse(num) * multiplier;
}
0 голосов
/ 20 декабря 2011

Ваша лучшая ставка, вероятно, состоит в том, чтобы использовать регулярное выражение ( Документы MSDN здесь ), по которому можно сгруппироваться (это НЕ синтаксис регулярного выражения) [числа] [символ], тогда у вас есть 2 группы, первая будетваше число, второе будет вашим «фактором» символа

, затем преобразуйте первое с помощью double.TryParse() и пропустите второе с помощью переключателя или набора if операторов, чтобы умножить их по мере необходимости, чтобы получитьконечный результат.

...