Преобразование числа в текстовом поле в плавающее с #

У меня есть текстовое поле, которое принимает числа. Эти числа будут сохранены в базе данных. Когда я ввожу число, например 2,35, конвертирую в число с плавающей запятой и отправляю в базу данных, я получаю сообщение об ошибке, потому что база данных принимает только число с точкой, например. 2.35

float num = float.Parse(textBox1.Text);

число по-прежнему 2,25

Как с этим справиться? Я пробовал с CultureInfo.InvariantCulture, но так и не получил то, что хочу


person Josef    schedule 04.04.2013    source источник
comment
почему вы используете запятую вместо точки?   -  person XTGX    schedule 04.04.2013
comment
Где у вас ошибка? Если это проблема с хранением данных в базе данных, нам нужно будет увидеть ваш код SQL.   -  person John Koerner    schedule 04.04.2013
comment
Вы можете использовать простой string.Replace для замены запятых точками.   -  person Nolonar    schedule 04.04.2013
comment
@XTG В разных культурах используются разные десятичные символы. В большинстве стран Европы вместо точки используется запятая.   -  person John Koerner    schedule 04.04.2013
comment
Это может быть полезно: stackoverflow.com/questions/2583362/   -  person BambooleanLogic    schedule 04.04.2013
comment
@Nolonar, это заменит числа вроде 1.000.000,00 (один миллион) на 1.000.000.00. Он должен получить текущую культуру из операционной системы (используя Thread.CurrentThread.CurrentCulture). Подробнее читайте здесь   -  person cesarse    schedule 04.04.2013
comment
@cesarse Просто из любопытства: как эта культура определяет плавающую точку?   -  person Nolonar    schedule 04.04.2013
comment
@Nolonar В текстовом поле по умолчанию используется тот же язык, что и в ОС. Обычно, когда в качестве десятичного разделителя используется запятая, точка используется в качестве разделителя тысяч. В классе CultureInfo есть метод GetFormat, который возвращает объект, определяющий, как форматировать числа и даты.   -  person cesarse    schedule 04.04.2013
comment
Ошибка, которую я получаю при сохранении в базу данных, состоит в том, что количество столбцов не соответствует количеству значений. Это когда я сохраняю номер через запятую. Если я использую замену и конвертирую запятую в точку, это значение неверно; число 123,45 превратилось в 12345. Итак, как это сделать на разных машинах с разными настройками культуры? Как лучше всего для этого?   -  person Josef    schedule 04.04.2013
comment
Как вы сохраняете в базе? Если вы правильно используете параметры, исходный формат числа не будет иметь никакого значения.   -  person D Stanley    schedule 10.02.2015


Ответы (5)


Вы можете попробовать следующее:

float.Parse(textBox1.Text.Trim(), CultureInfo.InvariantCulture.NumberFormat);

Надеюсь, это решило бы проблему.

person ShaileshDev    schedule 30.06.2015

Самый простой способ - заменить "," на "." в лайке:

float num = float.Parse(textBox1.Text);
string stringValue = num.ToString().Replace(',', '.');

Затем отправьте "stringValue" в базу данных.

Надеюсь, это вам поможет.

person Igor Frank    schedule 04.04.2013
comment
это последнее решение хорошее, но не в том случае, если я хочу сохранить значение текстового поля в свойстве float ... должно быть универсальное решение для всех ... - person Josef; 04.04.2013

использовать это:

CultureInfo.CreateSpecificCulture("en-US");

У меня была такая же проблема, и она решена кодом выше

person Harits Fadillah    schedule 04.04.2013

num - это 2,25, потому что это показано вам в вашей культуре. Он будет правильно передан в базу данных, если вы используете обычные механизмы (т.е. подготовленные операторы с параметрами). Если вы настаиваете на ручном склеивании SQL, то непременно используйте InvariantCulture для форматирования числа, но, как правило, не делайте этого.

person Joey    schedule 04.04.2013

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

//save current culture and set to english
CultureInfo current = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

//Do Math and Data things

//restore original culture
System.Threading.Thread.CurrentThread.CurrentCulture = current;

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

Изменить

Чтобы сохранить данные и преобразовать число в строку, вы поступите точно так же. Хотя текущий параметр CultureInfo для потоков установлен как «en-US», .ToString() методы из всех чисел будут использовать «.» вместо "," для десятичной точки. Другой способ сделать это - указать поставщика формата при вызове .ToString ().

decimalNumber.ToString(new CultureInfo("en-US"));

Это указывает, что при преобразовании числа в строку следует использовать NumberFormat из предоставленного языка и региональных параметров.

person Nevyn    schedule 08.04.2013
comment
Работает нормально, сохраняет всегда одинаково. Десятичный ввод; CultureInfo current = System.Threading.Thread.CurrentThread.CurrentCulture; System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo (en-US); input = decimal.Parse (textBox1.Text.Replace (',', '.')); System.Threading.Thread.CurrentThread.CurrentCulture = текущий; Например, если пользователь вводит 4,5 или 4,5, выход будет 4,5. Хорошо. Но если я хочу сохранить это значение в db-table, я должен преобразовать его в строку и заменить запятую точкой. Я хочу этого избежать. Есть ли другой способ справиться с этим? - person Josef; 10.04.2013