parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

В XSLT отличный форматтер

G_Z 29.10.2023 09:21 / 29.10.2023 09:54

Много лет пользуюсь методом:
@format[number;format;locale;options][locals]
# 1000.1 ru → 1 000,1
# 1000.1 en → 1,000.1

$formats[
	$.en[#,###.##]
	$.ru[# ###,##]
	$._default[#,##]
]

^if(!def $locale){
	$locale[ru]
}

^if(!def $format){
	$format[$formats.$locale]
}

^if($number > 0 && ^options.sign.bool(false)){
	$format[+$format]
}

$document[^xdoc::create{<?xml version="1.0" encoding="utf-8"?>
<number>
	<value>$number</value>
	<format>$format</format>
	<locale>$locale</locale>
</number>}]

$template[^xdoc::create{<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:decimal-format name="ru" decimal-separator="," grouping-separator=" " NaN="—" minus-sign="−"/>
	<xsl:decimal-format name="en" decimal-separator="." grouping-separator="," NaN="–" minus-sign="−"/>

	<xsl:template match="/number">
		<xsl:value-of select="format-number(value, format, locale)"/>
	</xsl:template>
</xsl:stylesheet>}]

$result[^document.transform[$template]]
$result[^result.string[
	$.method[text]
	$.indent[no]
]]
$result[^result.replace[ ; ]]

# examples
^format()[# ###,###]
^format()[# ###]
^format()[0,#]
^format()[;en]
^format()
Избыточно, конечно, и для большого числа форматирований лучше не использовать, зато гибко.