ImportExcel icon indicating copy to clipboard operation
ImportExcel copied to clipboard

Number conversion

Open scriptingstudio opened this issue 9 months ago • 2 comments

In EPPlus functions where number conversion is used like below, value of CurrentInfo may not work. Decimal separator makes difference. Enum value should be replaced with InvariantInfo

[Double]::TryParse($v, [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number)

It looks like this

$number = $null
[Double]::TryParse('999.45', [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number)
False

[Double]::TryParse('999,45', [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number)
True

[Double]::TryParse('999.45', [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::InvariantInfo, [Ref]$number)
True
[Double]::TryParse('999,45', [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::InvariantInfo, [Ref]$number)
True

In my environment it works.

scriptingstudio avatar Apr 25 '25 18:04 scriptingstudio

Test snippet for whom it may concern

function Use-Culture {
	param (
		[System.Globalization.CultureInfo]$culture = (throw "USAGE: Use-Culture -Culture culture -Script {scriptblock}"),
		[alias('sb')][ScriptBlock]$scriptblock = (throw "USAGE: Use-Culture -Culture culture -Script {scriptblock}")
	)
	$OldCulture = [System.Threading.Thread]::CurrentThread.CurrentCulture
	trap {
		[System.Threading.Thread]::CurrentThread.CurrentCulture = $OldCulture
	}
	[System.Threading.Thread]::CurrentThread.CurrentCulture = $culture
	Invoke-Command $scriptblock
	[System.Threading.Thread]::CurrentThread.CurrentCulture = $OldCulture
} # END Use-Culture

$cultures = [System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::AllCultures).name
'ar-IQ','de-DE','fr-FR','tr-TR','ru-RU','aa' | ForEach-Object {
	Use-Culture $_ -sb {
		$number = $null

		Write-Host "`nCurrent culture: $_`n"

		[Double]::TryParse('999.45', [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number)

		[Double]::TryParse('999.45', [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::InvariantInfo, [Ref]$number)
		[Double]::TryParse('999,45', [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::InvariantInfo, [Ref]$number)
	}
}


Current culture: ar-IQ

True
True
True

Current culture: de-DE

True
True
True

Current culture: fr-FR

False
True
True

Current culture: tr-TR

True
True
True

Current culture: ru-RU

False
True
True

Current culture: aa

True
True
True

UPDATE

Test your environment

Use-Culture (Get-Culture).Name -sb {
	$number = $null

	Write-Host "`nCurrent culture: $culture`n"

	[Double]::TryParse('999.45', [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::CurrentInfo, [Ref]$number)

	[Double]::TryParse('999.45', [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::InvariantInfo, [Ref]$number)
	[Double]::TryParse('999,45', [System.Globalization.NumberStyles]::Any, [System.Globalization.NumberFormatInfo]::InvariantInfo, [Ref]$number)
}

scriptingstudio avatar Apr 25 '25 19:04 scriptingstudio

Thanks for laying that out

dfinke avatar Apr 26 '25 02:04 dfinke

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

stale[bot] avatar Jun 27 '25 02:06 stale[bot]