Есть ли встроенная функция, которая разделяет запятые числом в C, C++ или JavaScript?

Учитывая номер 12456789Мне нужно вывести 12,456,789 без особого кодирования. Существуют ли какие-либо встроенные функции в C, C++ или JavaScript, которые я могу использовать для этого?

6 ответов

Решение

Я нашел эту маленькую функцию JavaScript, которая будет работать ( источник):

function addCommas(nStr){
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}

Да, это может быть сделано автоматически в C++, установив правильный фасет в локали.

#include <iostream>
#include <locale>
#include <string>


template<typename CharT>
struct Sep : public std::numpunct<CharT>
{
    virtual std::string do_grouping()      const   {return "\003";}
};

int main()
{
    std::cout.imbue(std::locale(std::cout.getloc(), new Sep <char>()));

    std::cout << 123456789 << "\n";

}

Примечание. C-locale (языковой стандарт, используемый в том случае, если ваше приложение специально не устанавливает его) не использует разделитель тысяч. Если вы установите язык вашего приложения на конкретный язык, тогда он выберет метод группировки для конкретных языков (без необходимости делать что-то причудливое, как описано выше). Если вы хотите установить в качестве языкового стандарта текущие языковые настройки вашего компьютера (как определено ОС), а не конкретный языковой стандарт, то используйте "" (пустую строку) в качестве языкового стандарта.

Итак, чтобы установить локаль в зависимости от настроек вашей ОС:

int main()
{
    std::cout.imbue(std::locale(""));

    std::cout << 123456789 << "\n";
}

В C++ вы обычно используете что-то вроде этого:

std::locale loc("");
std::cout.imbue(loc);

std::cout << 1234567;

Локаль с таким пустым именем, как это, не обязательно будет форматировать число точно так, как вы указали выше. Вместо этого он выбирает локаль из остальной части системы и форматирует соответствующим образом, поэтому для меня (с моей системой, настроенной для США) он выдаст "1 234 567", но если система была настроена для (большей части) Европа вместо этого выдаст "1.234.567".

В некоторых реализациях компилятора C и расширение предоставляется для printf Семейство функций, такое, что символ одинарной кавычки / апострофа, используемый в качестве модификатора в числовом спецификаторе формата, будет выполнять "группировку тысяч":

#include <stdio.h>
#include <locale.h>

int main(void)
{
    printf( "%'d\n", 1234567);

    setlocale(LC_NUMERIC, "en_US");
    printf( "%'d\n", 1234567);

    return 0;
}

будет производить (с GCC 4.4.1 в любом случае):

1234567
1,234,567

К сожалению, это расширение не особенно широко поддерживается.

// Еще один метод javascript, работающий с числами

Number.prototype.withCommas= function(){    
    return String(this).replace(/\B(?=(?:\d{3})+(?!\d))/g,',')
}

var n=12456789.25;
alert(n.withCommas());

/* возвращаемое значение: (строка) 12 456 789,25 */

Для C++ вы можете попробовать:

std::locale get_numpunct_locale(std::locale locale = std::locale(""))
{
#if defined(_MSC_VER) && defined(_ADDFAC) && (!defined(_CPPLIB_VER) || _CPPLIB_VER < 403)
    // Workaround for older implementations
    std::_ADDFAC(locale, new std::numpunct<char>());
    return locale;
#else
    return std::locale(locale, new std::numpunct<TCHAR>());
#endif
}

template<class T>
std::string nformat(T value)
{
    std::ostringstream ss;
    ss.imbue(get_numpunct_locale());
    ss << value;
    return ss.str();
}
Другие вопросы по тегам