C # преобразовать отформатированную строку (31.2k) обратно в число (31240) - PullRequest
3 голосов
/ 13 октября 2011

Допустим, у меня есть этот код:

int i = 31240;
string Number = ((double)i / 1000).ToString("0.#k");

Я получаю этот результат в виде строки для числа: 31,2k

А теперь я хочу сделать прямо противоположное, то есть взять эту строку «31,2k» и вернуть ее обратно к 31240 или даже к 31200, но я не знаю, как это сделать ... Есть идеи?


Кто-то сказал, что это невозможно. НО Наконец я нашел идеальный способ достичь своей цели. Я выкладываю решение для тех, кто хотел бы знать. Использование простое и позволяет сделать 2 вида конверсий:

  • Тысячи, Пример: 45831 <=> 45,8k <=> 45831
  • Миллионы, пример: 123852376 <=> 123,5м <=> 123852376

Ответы [ 2 ]

5 голосов
/ 13 октября 2011
int i = (int)(Double.Parse(Number.Substring(0, Number.Length - 1)) * 1000);

Мы удаляем k с помощью Number.Substring(0, Number.Length - 1), преобразуем его в удвоенное значение с Double.Parse, умножаем на 1000 и в конце преобразуем в int.Порядок вещей очень важен!В первый раз, когда я делал (int)Double.Parse(Number.Substring(0, Number.Length - 1)) * 1000, который преобразовывал в int перед умножением (поэтому я получил 31000 вместо 31200)

Я добавлю, что если бы мне пришлось писать этот код, я бы спал ОЧЕНЬ лучшеесли бы я использовал Decimal.Parse вместо Double.Parse (поэтому я был бы уверен против капризов с плавающей запятой)

Я добавлю лучший метод:

int i2 = int.Parse(Number.Substring(0, Number.Length - 1).Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, string.Empty)) * 100;

Этогораздо интереснее.Мы удаляем k, как и в другом методе, но на этот раз мы удаляем , и из string и умножаем на 100.

Интересный трюк заключается в том, что вместо простогов итальянском сленге, как и говядине), заменив , пустой строкой, мы получим текущий десятичный разделитель (CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) и заменим TH пустой строкой.

Очевидно, если бы мы использовали другуюкультура при составлении исходной строки (например, всегда хорошая CultureInfo.InvariantCulture), мы использовали бы это, чтобы получить NumberDecimalSeparator

0 голосов
/ 13 октября 2011

Вот решение, которое я прошел:

public class StringFromInt
{
    public enum FormatStyle
    {
        Kilo = 1000,
        Mega = 1000000
    }
    public int Number;
    public FormatStyle Format
    {
        get
        {
            switch (LimitValueBeforeConversion)
            {
                case 1000: return FormatStyle.Kilo;
                case 1000000: return FormatStyle.Mega;
                default:
                    throw new NotImplementedException("You must implement the code for this kind of value");
            }
        }
        set
        {
            if (value == FormatStyle.Kilo)
            {
                LimitValueBeforeConversion = 1000;
            }
            else if (value == FormatStyle.Mega)
            {
                LimitValueBeforeConversion = 1000000;
            }
        }
    }
    public int LimitValueBeforeConversion
    { get; set; }
    public static implicit operator int(StringFromInt s)
    {
        return s.Number;
    }
    public static implicit operator StringFromInt(int number)
    {
        StringFromInt s = new StringFromInt(number);
        return s;
    }

    #region Constructors
    public StringFromInt(int number, FormatStyle format)
    {
        this.Number = number;
        Format = format;
    }
    public StringFromInt(int number)
        : this(number, FormatStyle.Kilo)
    {
        if (number >= 1000000)
        {
            this.Format = FormatStyle.Mega;
        }
    }
    #endregion

    public override string ToString()
    {
        if (Number >= LimitValueBeforeConversion)
        {
            string formatString = "0.#k";
            switch (Format)
            {
                case FormatStyle.Kilo:
                    formatString = "0.#k";
                    break;
                case FormatStyle.Mega:
                    formatString = "0.#m";
                    break;
                default:
                    throw new NotImplementedException("You must implement the code for this kind of value");
            }
            return ((double)Number / LimitValueBeforeConversion).ToString(formatString);
        }
        else
        {
            return Number.ToString();
        }
    }
}

А вот тестовая программа:

class Program
{
    static void Main(string[] args)
    {
        int i = 31240;

        string StringRepresentation = ((double)i / 1000).ToString("0.#k");
        int resultBackWithParse = int.Parse(StringRepresentation.Substring(0, StringRepresentation.Length - 1).Replace(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, string.Empty)) * 100;
        Console.WriteLine("Base number: " + i.ToString());
        Console.WriteLine(new string('-', 35));
        Console.WriteLine("String representation: " + StringRepresentation);
        Console.WriteLine("Int representation With Int.Parse: " + resultBackWithParse.ToString());
        Console.WriteLine();
        StringFromInt MySolutionNumber = i;
        int resultBackWithStringFromInt = MySolutionNumber;
        Console.WriteLine("String representation With StringFromInt: " + MySolutionNumber.ToString());
        Console.WriteLine("Int representation With StringFromInt: " + resultBackWithStringFromInt);

        Console.WriteLine(new string('=', 35) + "\n");
        i = 123456789;
        StringFromInt MyNumber = 123456789;
        int resultBack = MyNumber;
        Console.WriteLine("Base number: " + i.ToString());
        Console.WriteLine(new string('-', 35));
        Console.WriteLine("String representation With StringFromInt: " + MyNumber);
        Console.WriteLine("Int representation With StringFromInt: " + resultBack);

        Console.ReadKey(true);
    }
}

Как вы можете заметить, здесь нетнужно использовать «новый» инициализатор, я имею в виду, что нет необходимости делать:

StringFromInt Number = new StringFromInt(YourNumber)

Благодаря неявному оператору вы можете сделать:

StringFromInt Number = YourNumber

Я не знаю,но я думаю, что это хорошее начало, как вы думаете?

В любом случае, мне удалось сделать то, что я хотел, поэтому для людей, которые думали, что это невозможно, понимаете, это возможно: -)

Очевидно, что это можно улучшить: эта версия работает только для тысяч и миллионов.

Привет

...