Существует ли простой способ в PowerShell для форматирования чисел и т.п. в другой локали? Я в настоящее время пишу несколько функций для упрощения поколения SVG для меня и использования SVG .
как десятичный разделитель, в то время как PowerShell соблюдает мои настройки локали (de-DE
) при преобразовании чисел с плавающей запятой в строки.
Есть ли простой способ установить другую локаль приблизительно для одной функции без липкого
.ToString((New-Object Globalization.CultureInfo ""))
после каждого double
переменная?
Примечание: Это о локали, используемой для форматирования, не строки формата.
(Вопрос о стороне: Если я использую инвариантную культуру в этом случае или скорее en-US
?)
ETA: Ну, что я пробую, вот что-то как следующее:
function New-SvgWave([int]$HalfWaves, [double]$Amplitude, [switch]$Upwards) {
"<path d='M0,0q0.5,{0} 1,0{1}v1q-0.5,{2} -1,0{3}z'/>" -f (
$(if ($Upwards) {-$Amplitude} else {$Amplitude}),
("t1,0" * ($HalfWaves - 1)),
$(if ($Upwards -xor ($HalfWaves % 2 -eq 0)) {-$Amplitude} else {$Amplitude}),
("t-1,0" * ($HalfWaves - 1))
)
}
Просто немного автоматизации для материала, который я склонен писать все время и двойные значения, должно использовать десятичную точку вместо запятой (который они используют в моей локали).
ETA2: Интересные мелочи для добавления:
PS Home:> $d=1.23
PS Home:> $d
1,23
PS Home:> "$d"
1.23
Путем помещения переменной в строку локаль набора, кажется, не применяется, так или иначе.
Это функция PowerShell, которую я использую для тестирования скрипта в других культурах. Я считаю, что ее можно использовать для того, что вам нужно:
function Using-Culture ([System.Globalization.CultureInfo]$culture =(throw "USAGE: Using-Culture -Culture culture -Script {scriptblock}"),
[ScriptBlock]$script=(throw "USAGE: Using-Culture -Culture culture -Script {scriptblock}"))
{
$OldCulture = [System.Threading.Thread]::CurrentThread.CurrentCulture
$OldUICulture = [System.Threading.Thread]::CurrentThread.CurrentUICulture
try {
[System.Threading.Thread]::CurrentThread.CurrentCulture = $culture
[System.Threading.Thread]::CurrentThread.CurrentUICulture = $culture
Invoke-Command $script
}
finally {
[System.Threading.Thread]::CurrentThread.CurrentCulture = $OldCulture
[System.Threading.Thread]::CurrentThread.CurrentUICulture = $OldUICulture
}
}
PS> $res = Using-Culture fr-FR { 1.1 }
PS> $res
1.1
Я думал о том, как это упростить, и придумал ускорители:
Add-type -typedef @"
using System;
public class InvFloat
{
double _f = 0;
private InvFloat (double f) {
_f = f;
}
private InvFloat(string f) {
_f = Double.Parse(f, System.Globalization.CultureInfo.InvariantCulture);
}
public static implicit operator InvFloat (double f) {
return new InvFloat(f);
}
public static implicit operator double(InvFloat f) {
return f._f;
}
public static explicit operator InvFloat (string f) {
return new InvFloat (f);
}
public override string ToString() {
return _f.ToString(System.Globalization.CultureInfo.InvariantCulture);
}
}
"@
$acce = [type]::gettype("System.Management.Automation.TypeAccelerators")
$acce::Add('f', [InvFloat])
$y = 1.5.ToString()
$z = ([f]1.5).ToString()
Надеюсь, это поможет.