PowerShell, форматируя значения в другой культуре

Существует ли простой способ в 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

Путем помещения переменной в строку локаль набора, кажется, не применяется, так или иначе.

8
задан Joey 7 March 2010 в 17:16
поделиться

2 ответа

Это функция 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
11
ответ дан 5 December 2019 в 05:44
поделиться

Я думал о том, как это упростить, и придумал ускорители:

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()

Надеюсь, это поможет.

5
ответ дан 5 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: