Как разумно и безопасно преобразовать Double в String?

Попытка не повторять себя (быть сухим) здесь, помогите мне. =)

У меня есть 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()? Или я застрял с оператором switch без DRY? Или я могу нахально сделать decimal.ToString().Replace(".","")?

EDIT:

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

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

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

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.

Ответ 1

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

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

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

Ответ 2

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

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

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

rating.ToString(CultureInfo.InvariantCulture).Replace(".","");

Ответ 3

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

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

Ответ 4

вы можете просто использовать 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));
            }

результат будет alt text http://img689.imageshack.us/img689/6591/doubletostring.jpg

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

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

string ConvertToString(double dblNumber)
{
    return dblNumber.ToString("N1").Replace(".","").Trim('0');
}