NikFaraday
@NikFaraday
Student full-stack Developer

Влияет ли геолокация на парсинг float?

Есть удалённый сервер с IP где-то за бугром, на нём развёрнут сервер.

Ситуация:
При создании некого продукта на клиенте указываем его цену (float) и отправляем на сервер. Локально (На наших ip и Windows 10) всё происходит нормально, как и задумано. При тестировании на сервере начинается бред какой-то. На сервер передаются числа без знаков запятой или точки (Используются как разделители для числа)

Но сама суть в том, что при тестировании локально float.TryParse выдаёт true при парсе числа через запятую, а на сервере оно даже не доходит к этому

Передаю это всё дело через FromData

Тут дальше есть немного костылей связанных с JS. К примеру это:
let editPrice = $('#edit-price').val()
if (editPrice.length == 0) {
    // Error Viewing
    priceIsValid = false;
}

editPrice = editPrice.replace(',', '.')
if (editPrice != Number(editPrice)) {
    // Error viewing
    priceIsValid = false;
}
editPrice = editPrice.replace('.', ',')

let formData = new FormData();
formData.append('Price', editPrice)


Что бы никто не подумал, что описание вопроса не подходит к его названию. Этот костыль нормально работает локально, но на сервере вообще отваливается. Я просил в GPT, но говорит, что это скорее всего связанно с тем, что сервер находится в другом регионе, где правила разделения чисел иные

Как вообще это фиксить?

UPD: Вообще тут две проблемы в одной, с разными вариантами

1-й вариант:

Модель имеет стринговый Price
Клиент:
let editPrice = $('#edit-price').val()
if (editPrice.length == 0) {
    // Error Viewing
    priceIsValid = false;
}

editPrice = editPrice.replace(',', '.')
if (editPrice != Number(editPrice)) {
    // Error viewing
    priceIsValid = false;
}
editPrice = editPrice.replace('.', ',')

let formData = new FormData();
formData.append('Price', editPrice)


Тут ошибка с парсингом числа получается. Вот серверный код, где происходит неправильный парсинг:
if (!float.TryParse(vm.Price, out float price)) { ... }


2-й вариант:
Изменил модель, и теперь она принимает float Price

Клиент:
let editPrice = $('#edit-price').val()
if (editPrice.length == 0) {
    // Error Viewing
    priceIsValid = false;
}

editPrice = editPrice.replace(',', '.')
if (editPrice != Number(editPrice)) {
    // Error Viewing
    priceIsValid = false;
}
editPrice = Number(editPrice) // <-- Added

let formData = new FormData();
formData.append('Price', editPrice)


В таком случае в модели Price приходит как ноль. Пробовал также:
  • Number(editPrice)
  • parseFloat(editPrice)
  • +editPrice (GPT подсказал, что так так же можно)
  • Вопрос задан
  • 148 просмотров
Пригласить эксперта
Ответы на вопрос 1
AshBlade
@AshBlade
Просто хочу быть счастливым
Влияет скорее не геолокация, а локаль пользователя. В данном случае это влияет на разделитель.
Вот пример:
var number = 1.123;

var russian = new CultureInfo("ru-RU"); // Россия
var american = new CultureInfo("en-US"); // США
Console.WriteLine($"Россия: {number.ToString(russian)}");
// Вывод: 1,123
Console.WriteLine($"Америка: {number.ToString(american)}");
// Вывод: 1.123


UPD: TryParse и Parse методы принимают в себя IFormatProvider, который имеет информацию о локали (CultureInfo)
if (double.TryParse("123.123", russian, out var result))
{
    Console.WriteLine($"Русский: {result}");
}
else if (double.TryParse("123.123", american, out result))
{
    Console.WriteLine($"Американский: {result}");
}
else
{
    Console.WriteLine($"Ни один не сработал");
}
// Выведет: Американский: 123,123
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы