Являются ли методы .net SqlDataReader культуральными инвариантами
blockquote>
SqlDataReader
не используют никакихCultureInfo
или что-то эквивалентное. Он не знает культур.Когда ваши значения хранятся в db как десятичные, SqlDataReader получает это десятичное значение. Как они (string-), представленные в вашем приложении, зависят от того, как вы это делаете: просто с помощью
dataReader["myColumn"].ToString()
будет использоваться ваш текущийCultureInfo
. Если вы хотите другую культуру, вы должны явно указать это.Что произойдет, если они сохранены в varchar и попытаются использовать .GetDecimal ()?
blockquote>Когда они хранятся как строки, у вас есть проблема (по крайней мере, если вы не знаете культуру, с которой были созданы эти строки). Вы должны использовать правильные
CultureInfo
для первого parse эти строки, чтобы получить правильные значения. Но почему бы вам хранить номера как строки в вашем db?
Ваш код довольно запутан. Половина вашего кода обрабатывает строку как последовательность символов (что правильно), а другая половина обрабатывает ее как последовательность чисел с плавающей запятой, что на самом деле неверно. Например,
std::vector<float> arr(trans_matrix.size(), 0);
это создает вектор того же размера, что и строка. Но размер строки - это количество символов, которое не совпадает с числом чисел в строке. Также
arr[j] = std::stof(trans_matrix[i]);
trans_matrix[i]
- это символ, это не строка, поэтому вы не можете использовать функцию, которая преобразует строку в число с плавающей точкой.
Я пытаюсь прояснить, что вы не можете программировать, написав правильный код. Вы должны тщательно подумать о том, что вы делаете, и написать абсолютно правильный код. Вы должны быть абсолютно ясны и точны в отношении концепций.
Как бы вы это сделали, если бы читали из std::cout
? Ну, это точно так же, если вы читаете из строки, за исключением того, что вы используете std::istringstream
вместо std::cout
. Вот один простой способ.
#include <sstream>
std::vector<float> arr;
std::istringstream input(trans_matrix);
float f;
while (input >> f)
arr.pusk_back(f);
Просто, создайте поток строк, считывайте поплавки по одному, добавляйте их в вектор.