Как к разумно и безопасно преобразовывают Вдвое большее по сравнению со Строкой?

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

У меня есть двойное, которое представляет оценку / 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() метод? Или застревают я с оператором переключения неDRY? Или я могу развязно сделать a decimal.ToString().Replace(".","")?

Править:

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". В этом случае синтаксический сахар дополнительных методов сохранил это, DRY, и и фактическая короткая реализация удовлетворяет KISS.

11
задан abatishchev 6 August 2014 в 16:04
поделиться

8 ответов

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

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

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

9
ответ дан 3 December 2019 в 06:44
поделиться

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

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

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

rating.ToString(CultureInfo.InvariantCulture).Replace(".","");
4
ответ дан 3 December 2019 в 06:44
поделиться

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

2
ответ дан 3 December 2019 в 06:44
поделиться

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

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

2
ответ дан 3 December 2019 в 06:44
поделиться

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

1
ответ дан 3 December 2019 в 06:44
поделиться

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

0
ответ дан 3 December 2019 в 06:44
поделиться

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

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

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

string ConvertToString(double dblNumber)
{
    return dblNumber.ToString("N1").Replace(".","").Trim('0');
}
-1
ответ дан 3 December 2019 в 06:44
поделиться

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

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
ответ дан 3 December 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: