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

Ссылка скопирована
1 ответ

Есть удалённый сервер с 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)

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)

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)) { ... }

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)

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 подсказал, что так так же можно)

Дополнительно:

Геолокация не влияет, теоретически могут влиять настройки локали на конкретной машине. Как на практике не знаю, не сишарпер.
JS код выглядит рабочим, за исключением того, что значение priceIsValid никак не используется.

  • Алексей Уколов, ну, я это и имею ввиду, что локация на самом пк
  • На сервер передаются числа без знаков запятой или точки (Используются как разделители для числа)

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

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

  • Алексей Уколов, скорее и то, и другое.
    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)

    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)) { ... }

    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)

    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 подсказал, что так так же можно)
  • Ответы:

    Влияет скорее не геолокация, а локаль пользователя. В данном случае это влияет на разделитель.
    Вот пример:

    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

    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

    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

    • Посмотрите, я немного изменил вопрос

      Я так же пробовал второй вариант, что бы сразу передавать в модели число (float), но я не могу его нормально передать через FormData

    • https://stackoverflow.com/questions/63157426/error...
      Вот это скорее вам поможет, из-за неверной локали asp не может верно распарсить данные формы. Ну и попробуйте через postman потестировать запрос.
    • Роман, спасибо, посмотрю
    • Роман, да, это помогло. Спасибо большое. Напишите отдельным ответом, я отмечу решением
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Андрей PHP Ответ

    Геолокация может влиять на парсинг float в определенных случаях.

    Когда вы парсите float из строки, важно учитывать, что разделитель дробной части может различаться в зависимости от настроек региональных параметров (locale) на компьютере. Например, в некоторых странах используется запятая в качестве разделителя, в то время как в других - точка.

    При парсинге float в PHP, если вы используете функцию типа `floatval` или `float` для преобразования строки в число с плавающей запятой, PHP будет автоматически использовать текущую локальную настройку для определения разделителя дробной части.

    Если вам необходимо обеспечить однозначность парсинга float независимо от геолокации, рекомендуется явно указывать разделитель дробной части при парсинге строки. Например, можно использовать функцию `str_replace` для замены запятой на точку перед парсингом:

    $str = "3,14";
    $floatVal = floatval(str_replace(',', '.', $str));

    $str = "3,14"; $floatVal = floatval(str_replace(',', '.', $str));

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

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно