Бывают случаи, когда требуется конвертировать дробный тип (float, decimal) в тип string.
Это может быть ситуация формирования команды запроса к БД:
Guid ID = Guid.NewGuid().ToString();
decimal Amount = 147.78;
String string_ID = ID.ToString();
String string_Amount = Amount.ToString();
string query = string.Format(
"INSERT INTO MyTable (ID, Amount) VALUES " +
"('{0}', '{1}')", string_ID, string_Amount);
Перед тем, как поместить в параметры запроса значения из переменных ID и Amount, следует привести их в тип string.
Но тут возникает одна проблема. По умолчанию значение 147.78 метод ToString представит в виде строкового литерала «147,78». То есть, в запросе INSERT к БД в качестве значения для столбца MyTable.Amount[decimal] прийдет значение 147,78, а ожидается 147.78. Таким образом, незначительное отклонение представление дробного числа приводит к возникновению исключительной ситуации с невозможностью занесения изменений в БД.
Для таких случаев как раз и существует класс CultureInfo, который способен помогать в представлении тех, или иных типов.
В нашем случае достаточно вызвать перегрузку метода ToString с указанием точного представления форматных данных:
string string_Amount =
Amount.ToString(CultureInfo.InvariantCulture.NumberFormat);
Теперь, в переменной string_Amount содержится значение "147.78".
То есть, мы опять же получили стринговый литерал, но только знак "," заменен ".", что и требовалось.
Обратный процесс ничем не отличается:
decimal num =
decimal.Parse("147.78",
CultureInfo.InvariantCulture.NumberFormat);
decimal num =
decimal.Parse("147,78",
CultureInfo.GetCultureInfo("de-DE").NumberFormat);
Или:
double Amount = 200.318;
Console.WriteLine(
(Amount * 2 - 45).ToString("c",
CultureInfo.CurrentCulture.NumberFormat));
Просто всегда следует следить за представлением символа, отделяющим целую и дробную часть. В не зависимости от стрингового представления, дробное представление должно быть построено с знаком «.».