Ответ 1
Десятичный разделитель зависит от текущих предпочтений культуры:
d.Replace(
System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator,
String.Empty)
заменит '.'
или ','
на ""
Попытка не повторять себя (быть сухим) здесь, помогите мне. =)
У меня есть 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.
Десятичный разделитель зависит от текущих предпочтений культуры:
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(".","");
Я бы просто использовал метод "нахально", который вы описываете в конце. В чистой семантике вещи вы управляете строкой, а не фактическим числом, поэтому я думаю, что замена строки будет именно правильным рецептом здесь.
Если вы действительно хотите скомпрометировать его, подумайте о создании нового IFormatProvider для этой ситуации. Это было бы лучшим способом уловить потенциальные ошибки, но это добавляет уровень сложности.
вы можете просто использовать 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
Используйте хэш-таблицу/словарь и сохраняйте сопоставления от двойного до строки. Это будет намного более прочным и простым, чем анализ двойного
Чтобы избежать беспорядка с десятичными форматами, я бы отформатировал всю часть как целое число и использовал поиск массива для дробной части:
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" };
Вы можете вызвать ToString()
, а затем использовать регулярное выражение, подобное замене
"([0-9])\\.([0-9])" with "\\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');
}