如何在同一文档中添加不同类型的千位分隔符并对不同类型的数字进行四舍五入?我想设置欧元金额始终四舍五入到小数点后两位,并使用.
千位分隔符和,
小数点,如下所示:1.234,56 €
所有其他数字应使用小空格\,
作为千位分隔符(仍.
作为小数点),并且根本不进行四舍五入,如下所示:1 234,567 89 g
或12 345,678 9 m
我尝试过和siunitx
,numprint
但两者都只能为所有数字提供一种设置……并且numprint
无法正确显示单位或以我选择的字体显示。
\documentclass{scrlttr2}
\usepackage[ngerman]{babel}
\usepackage[scaled]{helvet}
\renewcommand\familydefault{\sfdefault}
\usepackage[detect-all, locale=DE, separate-uncertainty]{siunitx}
\sisetup{group-separator = {.}, group-minimum-digits = 4}
\begin{document}
\SI{1234.5678}{€}
\SI{1234.56789}{g}
\SI{12345.6789}{m}
\end{document}
PS:理想情况下,我可以根据\usepackage[ngerman]{babel}
或选择的语言设置千位分隔符\usepackage[english]{babel}
答案1
您可以在本地设置密钥。我不会使用\SI
它来表示金额,而是\num
使用货币符号。
也\SI
應該\qty
。
\documentclass{scrlttr2}
\usepackage[ngerman]{babel}
\usepackage[scaled]{sourcesanspro}
\renewcommand\familydefault{\sfdefault}
\usepackage{siunitx}
\sisetup{
detect-all,
locale=DE,
separate-uncertainty,
output-decimal-marker={.},
}
\NewDocumentCommand{\EUR}{m}{%
\num[
group-minimum-digits=3,
round-mode=places,
group-separator={.},
output-decimal-marker={,}
]{#1}\,€%
}
\begin{document}
\EUR{1234.5678}
\qty{1234.56789}{g}
\qty{12345.6789}{m}
\end{document}
抱歉,我不喜欢 Helvetica。
答案2
如果您愿意并且能够使用 LuaLaTeX 编译您的文档,以下解决方案应该会引起您的兴趣。(以下测试文档也将在 pdfLaTeX 下编译,但它不会执行您想要应用于欧元计价货币金额的特殊格式。
% !TEX TS-program = lualatex
\documentclass{scrlttr2}
\usepackage[ngerman]{babel}
\usepackage{siunitx}
\sisetup{detect-all,
locale = DE,
separate-uncertainty,
group-separator = {\,},
output-decimal-marker = {,},
group-minimum-digits = 4}
\usepackage{iftex} % for "\ifluatex" conditional
\ifluatex
\usepackage{fontspec}
\setmainfont{Helvetica Neue}
\else
\usepackage[scaled]{helvet}
\renewcommand\familydefault{\sfdefault}
\fi
\ifluatex
\usepackage{luacode}
\begin{luacode}
function DoEuro ( s )
-- take care to permit whitespace in the input string (with "%s-")
s = s:gsub ("\\SI%s-%{%s-([%d%.]+)%s-%}%s-%{%s-€%s-%}",
"\\SI[group-separator={.}, round-precision=2, round-mode=places]{%1}{€}" )
return s
end
\end{luacode}
%% assign the "DoEuro" function to LuaTeX's `process_input_buffer` callback:
\AtBeginDocument{\directlua{luatexbase.add_to_callback (
"process_input_buffer" , DoEuro, "DoEuro" )}}
\fi
\begin{document}
\SI{1234.5678}{€ }
\SI { 123456789.012345 } { € }
\medskip
\SI{1234.56789}{g}
\SI{12345.6789}{m}
\end{document}
答案3
您可以使用以下机制提供的重新定义的几个占位符babel
:
\documentclass{scrlttr2}
\usepackage[ngerman]{babel}
\usepackage[scaled]{helvet}
\renewcommand\familydefault{\sfdefault}
\usepackage[detect-all, locale=DE, separate-uncertainty]{siunitx}
\sisetup{
group-separator = {\thegroupmark},
output-decimal-marker = {\thedecimalmark},
group-minimum-digits = 4}
% The default values
\newcommand\thedecimalmark{,}
\newcommand\thegroupmark{\,}
% Reset at every language
\AddBabelHook{decimal}{afterextras}{%
\renewcommand\thedecimalmark{,}%
\renewcommand\thegroupmark{\,}}
% Set for a specific language (here english)
\AddBabelHook[english]{decimal}{afterextras}{%
\renewcommand\thedecimalmark{.}%
\renewcommand\thegroupmark{,}}
\begin{document}
\SI{1234.5678}{€}
\selectlanguage{english} \SI{1234.5678}{€}
\selectlanguage{ngerman} \SI{1234.5678}{€}
\end{document}