为C printf设置千位分隔符

Al *_*ndy 9 c printf locale

我有这个C代码:

locale_t myLocale = newlocale(LC_NUMERIC_MASK, "en_US", (locale_t) 0);
uselocale(myLocale);
ptrLocale = localeconv();
ptrLocale->thousands_sep = (char *) "'";

int i1 = snprintf( s1, sizeof(s1), "%'d", 123456789);
Run Code Online (Sandbox Code Playgroud)

输出s1123,456,789.

即使我设置->thousands_sep'它被忽略.有没有办法将任何字符设置为千位分隔符?

Al *_*ndy 3

这是一个非常简单的解决方案,适用于每个 Linux 发行版,并且不需要 - 作为我的第一个答案 - 黑客glibc


在按照本说明的建议使用单独的构建目录构建版本后,所有这些步骤都必须在原始 目录中执行glibc而不是在构建目录中。glibc

我的新locale文件名为en_AT.

  1. localedata/locales/在目录中从现有文件创建en_US一个新文件en_AT
  2. 将所有条目更改为thousands_septothousands_sep "<U0027>"或您想要用作千位分隔符的任何字符。
  3. 将新文件内部所有出现的 更改en_USen_AT
  4. 将行添加到文件中localedata/SUPPORTEDen_AT.UTF-8/UTF-8 \.
  5. 在构建目录中运行make localedata/install-locales
  6. 然后,新的内容locale将自动添加到系统中,并且程序可以立即访问。

在 C/C++ 程序中,您可以使用以下命令切换到新的千位分隔符:

setlocale( LC_ALL, "en_AT.UTF-8" );

使用它printf( "%'d", 1000000 );产生这个输出

1'000'000


备注:当您在程序中需要在运行时确定的不同本地化时,您可以从加载请求的页面中使用此示例,只需替换.manlocaleLC_NUMERICen_AT