Преобразовать число с точкой вместо запятой?

У меня есть данные из таблицы в базе данных (строка), которые содержат текст и цену. Я извлекаю цену из данных, но моя проблема в том, что иногда я могу преобразовать ее в плавающую, а иногда нет.

Я заметил, что:

Convert.ToSingle(m.Groups[1].Value);

Это работает, но не всегда, потому что иногда проблема возникает с точкой (требуется запятая). Что я могу сделать? Я пытался заменить «.», на «,», но иногда на другом ПК это точка, которая требуется!


person Mister Dev    schedule 11.12.2008    source источник


Ответы (4)


У вас есть эта проблема, потому что преобразование проверяет язык вашего ПК. Вам нужно будет сделать что-то вроде:

Convert.ToSingle(m.Groups[1].Value, CultureInfo.InvariantCulture.NumberFormat);

Таким образом, он не будет проверять язык ПК. Дополнительную информацию об InvariantCulture можно найти в MSDN. . У меня есть что-то подобное в проекте, и моя конвертация работает.

person Patrick Desjardins    schedule 11.12.2008
comment
Ты опередил меня на 17 секунд! На самом деле вам не нужно свойство NumberFormat, поскольку CultureInfo уже реализует IFormatProvider. - person leppie; 11.12.2008
comment
:P Я увеличил свой набор текста, так как участвую в SO;) - person Patrick Desjardins; 11.12.2008

Или запросите этот конкретный числовой формат явно:

System.Globalization.NumberFormatInfo nf
  = new System.Globalization.NumberFormatInfo ( )
{
  NumberGroupSeparator = "."
};
float f = float.Parse ( "5.34534", nf );
person baretta    schedule 11.12.2008

Если у вас нет прав на запись в базу данных, первое, что нужно сделать, это попытаться убедить источники данных использовать инвариантную культуру. Если данные вводятся пользователем, вы можете сделать что-то вроде:

float f = float.Parse(input);
string toDb = f.ToString(CultureInfo.InvariantCulture);

А потом с другой стороны:

float f = float.Parse(fromDb, CultureInfo.InvariantCulture);
string toOutput = f.ToString();

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

Я бы также, как видно из приведенных выше фрагментов, рекомендовал использовать float.Parse вместо Convert по ряду причин, но наиболее важной из них является возможность использовать TryParse:

float f;
if (!float.TryParse(input, out f))
{
    // ERROR
}
person ICR    schedule 11.12.2008

Как говорили другие:

Convert.ToSingle(m.Groups[1].Value, CultureInfo.InvariantCulture);

Вы также должны убедиться, что используете InvariantCulture при записи в базу данных. (Было бы еще лучше, если бы вы сохранили данные в столбец с его собственным типом данных, но я отвлекся...)

person Christoffer Lette    schedule 11.12.2008
comment
Простое повторение того, что было сказано, не принесет вам больше репутации. - person leppie; 11.12.2008
comment
@leppie, я думаю, что действительно добавил некоторую ценность. И отсутствие голосов не принесет мне никакой репутации. - person Christoffer Lette; 11.12.2008
comment
Я согласен с тем, что значение было добавлено с объяснением требования NumberFormat. - person ZombieSheep; 11.12.2008
comment
У меня нет прав на запись в базу данных. - person Mister Dev; 11.12.2008
comment
@Mister Dev: рекомендация использовать InvariantCulture при хранении и сериализации остается в силе. (Как говорит @ICR...) - person Christoffer Lette; 11.12.2008