При попытке не повторить меня (чтобы быть 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.
Десятичный разделитель зависит от текущего языка и региональных параметров:
d.Replace(
System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator,
String.Empty)
заменит '.'
или ','
на ""
Если вы можете жить со строками типа 00, 05, 10, 15, 20 ...
и т.д., вы можете просто использовать
(rating * 10).ToString("00")
Если нет, используйте InvariantCulture
как аргумент к ToString
, чтобы заставить использовать десятичную точку (".") во всех странах (в Германии по умолчанию будет ",", например):
rating.ToString(CultureInfo.InvariantCulture).Replace(".","");
вы можете просто использовать 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));
}
Я бы просто использовал «дерзкий» метод, который вы описываете в конце. В чистой семантике вещи вы манипулируете строкой, а не фактическим числом, поэтому я думаю, что замена строки была бы здесь как раз правильным рецептом.
Если вы действительно хотите его усложнить, подумайте о создании нового IFormatProvider для этой ситуации. Это был бы лучший способ выявления потенциальных ошибок, но он добавляет уровень сложности.
Используйте хэш-таблицу/словарь и храните в нем отображения от двойников к строкам. Это будет гораздо надежнее и проще, чем парсинг вашего double
Вы можете вызвать ToString()
, а затем использовать регулярное выражение, например, заменить
"([0-9])\\\.([0-9])" на "\\\1\\\2"
,
что, хотя и является небольшим хаком, будет менее хрупким, чем Replace(".","")
Не пытайтесь найти более простой ответ на то, что уже просто. Самый простой способ сделать это - использовать этот код:
double dblNumber = 1.5;
string strDouble = dblNumber.ToString("N1").Replace(".","").Trim('0');
Если вы собираетесь делать это часто, оберните это в функцию:
string ConvertToString(double dblNumber)
{
return dblNumber.ToString("N1").Replace(".","").Trim('0');
}
Чтобы не возиться с десятичными форматами, я бы отформатировал целую часть как целое число и использовал поиск по массиву для дробной части:
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" };