При использовании parseFloat невозможно вычислить сумму более 1 миллиона

При использовании раздела флажков в asp.net в виде сетки со следующим кодом. не в состоянии посчитать сумму суммы, например,

  • если строка сетки имеет значение 1 001 870,00, то получение результат как 1

  • если строка сетки имеет значение 976 000, то получаем результат 976 000

я использую следующую функцию сценария,

function GetSelected() {
    debugger;
    
    var grid = document.getElementById("<%=grvGroup.ClientID%>");

    var checkBoxes = grid.getElementsByTagName("INPUT");
    var amountFC = 0;
    var amountVAT = 0;
    var amountSUMTOT = 0;
    var countSelect = 0;
    var totalValAmount = 0;
    
    if (grid.rows.length > 0) {

        for (var i = 1; i < grid.rows.length; i++) {
            var checkBoxes = grid.rows[i].getElementsByTagName('input');
            var checkedid = checkBoxes[0].getAttribute('id');
            var checkbox = document.getElementById(checkedid);

            if (checkbox.checked) {
                Amt = grid.rows[i].cells[5].innerText.replace(",", "");
                amountFC += parseFloat(Amt);
                Amt = grid.rows[i].cells[6].innerText.replace(",", "");
                amountVAT += parseFloat(Amt);
                
                countSelect++;
            }
        }
        jQuery('#<%=txtTotalAmount.ClientID %>').val(amountFC);
        jQuery('#<%=txtTotalVat.ClientID %>').val(amountVAT);
        var totalAmount = parseFloat(jQuery('#<%=txtTotalAmount.ClientID %>').val());
        var totalVat = parseFloat(jQuery('#<%=txtTotalVat.ClientID %>').val());
        var totalSum = totalAmount + totalVat;


        jQuery('#<%=txtPayableAmount.ClientID %>').val(totalSum);

    }
    if (grid.rows.length - 1 == countSelect) {
        document.getElementById("ContentPlaceHolder1_checkallselect").checked = true;
    }
    else {
        document.getElementById("ContentPlaceHolder1_checkallselect").checked = false;
    }
}
replace(",", ""); это заменит только 1 запятую. Вы можете использовать replaceAll,. например. может помочь такая функция, как -> const asNum = v => parseFloat(v.replaceAll(",",""));.
Keith 02.09.2024 12:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В документации JS-функции replace() мы можем прочитать следующее:

Строковый шаблон будет заменен только один раз. Чтобы выполнить глобальную выполнить поиск и замену, использовать регулярное выражение с флагом g или использовать вместо этого replaceAll().

Это два варианта удаления всех , со своего номера.

ЗаменитьВсе()

grid.rows[i].cells[5].innerText.replaceAll(",", "");

Использование РЕГЭКС

grid.rows[i].cells[5].innerText.replace(/,/g, "");

Документы

Заменить

Заменить все

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

Dev 02.09.2024 13:37

Пожалуйста, следуйте принципу DRY (не повторяйтесь).

Лучше всего создать полифилл для объекта окна с именем, например, parseFloatFromString(). Поместите этот код при загрузке вашего проекта.

Для вашего случая:

parseFloatFromString(grid.rows[i].cells[5].innerText);

// polyfill parseFloatFromString() now available in window object as parseFloat()

if (!('parseFloatFromString' in window)){
    Window.prototype.parseFloatFromString = function(numberInString){
        try {
            return +(numberInString.replaceAll(",", ""));
        } catch ( err ) { console.error(err) };
    }
}

console.info(parseFloatFromString('1,001,870.22'))

Другие вопросы по теме