Как правильно и безопасно конвертировать Double в String? - PullRequest
11 голосов
/ 26 июля 2010

Стараясь не повторяться (быть СУХИМ) здесь, помоги мне.=)

У меня есть double , который представляет рейтинг / 5.

Возможные значения:

0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5.

Я хочу преобразовать этов строку без десятичного знака.

Значения будут такими:

"0", "05", "1", "15", "2", "25", "3", "35", "4", "45", "5".

Почему я это делаю?Поскольку я пытаюсь динамически создать ссылку на основе значения:

string link = "http://somewhere.com/images/rating_{0}.gif";
return string.Format(link, "15");

Возможные значения обрабатываются / проверяются в другом месте, другими словами, я могу быть на 100% уверен, что значение всегда будет одним из этихя упомянул.

Есть идеи?Какой-то специальный формат, который я могу использовать в методе .ToString()?Или я застрял с оператором un-DRY switch?Или я могу дерзко сделать decimal.ToString().Replace(".","")?

РЕДАКТИРОВАТЬ:

Ого, спасибо за все ответы, ребята!=)

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

В любом случае, я в итоге создал простой метод расширения:

public static string ToRatingImageLink(this decimal value)
    {
        string imageLinkFormat = "http://somewhere.com/images/rating_{0}.gif";
        return string.Format(imageLinkFormat, value.ToString().Replace(".0", string.Empty).Replace(".", string.Empty);
    }

Думаю, это был случай "KISS" и "DRY".В этом случае синтаксический сахар методов расширения оставил его СУХИМ, а фактическая однострочная реализация удовлетворяет KISS.

Ответы [ 8 ]

9 голосов
/ 26 июля 2010

Десятичный разделитель зависит от текущих культурных предпочтений:

d.Replace(
    System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator,
    String.Empty)

заменит '.' или ',' на ""

4 голосов
/ 26 июля 2010

Если бы вы могли жить со строками типа 00, 05, 10, 15, 20 ... и т. Д., Вы могли бы просто использовать

(rating * 10).ToString("00")

Если нет, используйте InvariantCulture в качестве аргумента ToString, чтобы принудительно использоватьдесятичная точка (".") во всех странах (например, в Германии по умолчанию будет ","):

rating.ToString(CultureInfo.InvariantCulture).Replace(".","");
2 голосов
/ 26 июля 2010

вы можете просто использовать Replace(".", string.Empty); без необходимости Replace(".0", string.Empty)

проверьте код ниже

double[] x = { 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5 };
            foreach (var item in x)
            {
                listBox1.Items.Add(item.ToString().Replace(".", string.Empty));
            }

результат будет альтернативный текст http://img689.imageshack.us/img689/6591/doubletostring.jpg

2 голосов
/ 26 июля 2010

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

Если вы действительно хотите переосмыслить ее, подумайте о созданииновый IFormatProvider для этой ситуации.Это был бы лучший способ выявления потенциальных ошибок, но это добавляет уровень сложности.

1 голос
/ 26 июля 2010

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

public static string ToRatingImageLink(this decimal value)
{
    string imageLinkFormat = "http://somewhere.com/images/rating_{0}{1}.gif";
    int index = decimal.ToInt32(decimal.Round(value * 2));
    return string.Format(imageLinkFormat, index / 2, Suffix[index % 2]);
}

static readonly string[] Suffix = { "", "5" };
1 голос
/ 26 июля 2010

Используйте хеш-таблицу / словарь и сохраняйте отображения от двойного к строковому. Это будет намного надежнее и проще, чем парсинг вашего двойного

0 голосов
/ 26 июля 2010

Не пытайтесь найти более простой ответ на то, что уже просто.Самый простой способ сделать это - использовать этот код:

double dblNumber = 1.5;
string strDouble = dblNumber.ToString("N1").Replace(".","").Trim('0');

Если вы собираетесь много заниматься этим, оберните его в функцию:

string ConvertToString(double dblNumber)
{
    return dblNumber.ToString("N1").Replace(".","").Trim('0');
}
0 голосов
/ 26 июля 2010

Вы можете вызвать ToString(), а затем использовать регулярное выражение, например, заменить "([0-9])\\.([0-9])" with "\\1\\2", что, хотя все еще немного взломать, было бы менее хрупким, чем Replace(".","")

...