簡體   English   中英

.NET Framework中的區域設置覆蓋

[英]Regional Settings Override in .NET Framework

我目前遇到數字格式問題,我真的不知道該如何解決。

我使用了Support程序集中的一個函數:

'StringToFormat looks like "123.456789"
'FormatInfo looks like "0.000" (must display three decimals)
Support.Format(StringToFormat, FormatInfo)

它很好地發揮了作用,當我的區域設置設置不正確時,它不起作用... StringToFormat是一個來自另一個應用程序(通過TCP / IP)的變量,我無法更改它。 因此,當“十進制分隔符”設置為逗號而不是點時,“格式”功能會產生奇怪的現象,並且無法正確顯示我的值。

為了解決這個問題,我編寫了一個小函數,該函數實際上創建了新的區域性,並確保小數點分隔符是點:

Sub UpdateRegionalSettings()
    'I call this everytime I start my application
    My.Application.ChangeCulture("x-en-US-custom")
End Sub

Sub CreateMyCulture()
    'This function is called only if the culture doesn't exist yet
    Dim C As New CultureAndRegionInfoBuilder("x-en-US-custom", CultureAndRegionModifiers.None)
    C.LoadDataFromCultureInfo(New CultureInfo("en-US"))
    C.LoadDataFromRegionInfo(New RegionInfo("US"))
    C.NumberFormat.NumberDecimalSeparator = "."
    C.NumberFormat.CurrencyDecimalSeparator = "."
    C.Register()
End Sub

但是,這似乎不起作用,因為當我進入區域設置並將分隔符更改為昏迷時,Format函數再次變得很奇怪。 就像這些參數會覆蓋我在程序中可以說的任何內容...

我的問題是:如何強制Support.Format (和其他功能)使用點作為小數點分隔符,而不必手動將其設置為控制面板的區域和語言?

這是僅在運行時更改應用程序區域性的一種方法。 在表單加載中,將加載所有區域性,因此您可以對其進行修改,並在文本框控件中查看兩倍和日期時間的結果。

Imports System.Globalization
''' <summary>
''' Requires 
'''    1 ComboBox: cboCultures
'''    2 TextBoxes: TextBox1, TextBox2
'''    1 DateTimePicker: DateTimePicker1
''' </summary>
Public Class Form1
    ' Used to set cboCultures selected item and for restoring the current culture
    Private OriginalCultureName As String = ""
    Private OriginalCultureIndex As Integer = 0
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        OriginalCultureName = Application.CurrentCulture.Name
        DateTimePicker1.Format = DateTimePickerFormat.Custom

        cboCultures.DisplayMember = "DisplayName"
        cboCultures.ValueMember = "Code"
        cboCultures.DropDownStyle = ComboBoxStyle.DropDownList

        Dim CultureList =
            (
                From cultureitem In CultureInfo.GetCultures(CultureTypes.SpecificCultures)
                Order By cultureitem.EnglishName
                Select New With
                       {
                           .DisplayName = cultureitem.EnglishName,
                           .Code = cultureitem.Name
                       }
            ).ToList

        cboCultures.DataSource = CultureList

        ' get current culture so we can select it in cboCultures
        Dim item =
            (
                From T In CultureList _
                .Select(
                    Function(cultureitem, indexer)
                        Return New With {.Index = indexer, .Name = cultureitem.Code}
                    End Function)
                Where T.Name = OriginalCultureName
            ).First

        OriginalCultureIndex = item.Index
        cboCultures.SelectedIndex = OriginalCultureIndex
    End Sub

    Private Sub cmdChange_Click(sender As Object, e As EventArgs) Handles cmdChange.Click
        Application.CurrentCulture = New CultureInfo(cboCultures.SelectedValue.ToString)
        Demo()
    End Sub
    ''' <summary>
    ''' Show results for date and double
    ''' </summary>
    Private Sub Demo()
        DateTimePicker1.CustomFormat = DateTimeFormatInfo.CurrentInfo.FullDateTimePattern
        TextBox1.Text = DateTimePicker1.Value.ToString
        Dim value As Double = 123.456789
        TextBox2.Text = value.ToString
    End Sub
    Private Sub cmdRestore_Click(sender As Object, e As EventArgs) Handles cmdRestore.Click
        Application.CurrentCulture = New CultureInfo(OriginalCultureName)
        cboCultures.SelectedIndex = OriginalCultureIndex
        cmdChange.PerformClick()
        Demo()
    End Sub
End Class

更新 :我按照以下方式使用了字符串格式,它對我有用

Private Sub Demo()
    DateTimePicker1.CustomFormat = DateTimeFormatInfo.CurrentInfo.FullDateTimePattern
    TextBox1.Text = DateTimePicker1.Value.ToString
    Dim value As Double = 123.456789
    TextBox2.Text = value.ToString("c2")
    TextBox3.Text = String.Format("{0:c2}", value)
End Sub

在此處輸入圖片說明

在此處輸入圖片說明

由於不確定我是否使用了Support.Format函數,因此我對Decimal Separator遇到了相同的問題,並通過從用戶的區域設置中克隆當前區域性,然后設置了適當的屬性,然后應用更改來解決了該問題。到應用程序線程。 這使我的應用程序可以正常運行,而無需更改(或擔心)用戶的區域設置。

Dim cinfo As CultureInfo = Thread.CurrentThread.CurrentCulture.Clone()
cinfo.NumberFormat.NumberDecimalSeparator = "."
cinfo.NumberFormat.CurrencyDecimalSeparator = "."
cinfo.NumberFormat.CurrencyDecimalDigits = 2
Thread.CurrentThread.CurrentCulture = cinfo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM