簡體   English   中英

在 .NET 中使用以相反十進制字符(句點/逗號)格式化的數字讀取 XML

[英]Reading XML with numbers formatted with opposite decimal character (period/comma) in .NET

我的 VB.NET 應用程序將第 3 方網站生成的 XML 文件導入到 SQL Server 表中。 該網站(和我的計算機)使用句點字符表示小數(例如 42.015),並且一切正常。 但是一位歐洲用戶報告說,導入的數字乘以 1000 或 10000 的因數。結果他的計算機正在尋找逗號小數(例如 42,015),當它看到 XML 輸入時,它會將其轉換為 42015.00。

我正在使用 DataSet.ReadXML 和 SqlBulkCopy.WriteToServer 並且我不確定我可以在哪里介入告訴程序期望周期小數。 我的代碼如下:

    Dim ds As New DataSet
    Try
        ds.ReadXml(tempfile, 0)
    Catch ex As XmlException
        Log($"Error reading XML: {ex.Message} with {ex.Data}")
        Exit Sub
    End Try
    Dim columnMap As New Dictionary(Of String, String) From {
        {"LOTID", "InventoryID"},
        {"ITEMTYPE", "ItemType"},
        {"ITEMID", "ItemNum"},
        {"COLOR", "ColorID"},
        {"CONDITION", "Cond"},
        {"REMARKS", "LocationName"},
        {"QTY", "Qty"},
        {"DESCRIPTION", "Description"},
        {"SUBCONDITION", "Completeness"},
        {"SALE", "Discount"},
        {"STOCKROOM", "Stockroom"},
        {"BULK", "Bulk"},
        {"BUYERUSERNAME", "Reserve"},
        {"PRICE", "Price"}
    }
    Using conn = New SqlConnection(GetDBConnectionString)
        Using sbc As New SqlBulkCopy(conn)
            conn.Open()
            DoSql(conn, "TRUNCATE TABLE dbo.Online_Inventories;")
            For Each column As DataColumn In ds.Tables("ITEM").Columns
                If columnMap.ContainsKey(column.ColumnName) Then
                      sbc.ColumnMappings.Add(column.ColumnName, columnMap(column.ColumnName))
                End If
            Next
            sbc.DestinationTableName = "Online_Inventories"
            sbc.WriteToServer(ds.Tables("ITEM"))
            conn.Close()
        End Using
    End Using

導入的 XML 如下所示:

   <ITEM>
      <LOTID>217770136</LOTID>
      <DATEADDED>9/20/2020 3:02:00 PM</DATEADDED>
      <CATEGORY>771</CATEGORY>
      <COLOR>0</COLOR>
      <PRICE>11.7563</PRICE>
      <QTY>1</QTY>
      <BULK>1</BULK>
      <IMAGE></IMAGE>
      <DESCRIPTION></DESCRIPTION>
      <CONDITION>U</CONDITION>
      <SUBCONDITION>I</SUBCONDITION>
      <ITEMTYPE>S</ITEMTYPE>
      <ITEMID>41110-1</ITEMID>
      <SALE>0</SALE>
      <REMARKS></REMARKS>
      <STOCKROOM>Y</STOCKROOM>
      <MYWEIGHT>0</MYWEIGHT>
      <ITEMWEIGHT>0</ITEMWEIGHT>
      <DATELASTSOLD></DATELASTSOLD>
      <BASECURRENCYCODE>USD</BASECURRENCYCODE>
   </ITEM>

所以在這個例子中,在第三行(ds.ReadXml)之后,ds("Price")="11.7563",一個字符串 sbc.WriteToServer 行之后,dbo.Online_Inventories.Price 的值是117563.0(實際上是一個錯誤這種情況下,因為價格是一個 NUMERIC(9,4))

當用戶的家庭文化使用逗號作為小數時,如何讓 .net 將句點讀取為小數? 謝謝!

默認線程 CultureInfo 基於運行機器的設置文化。 默認字符串解析將使用默認 CultureInfo。 您可以在執行您發布的代碼時更改線程 CultureInfo 以使用 InvariantCulture(基本上是美國)。 InvariantCulture 使用句點 (.) 作為小數點。

Dim currentCulture As CultureInfo = Threading.Thread.CurrentThread.CurrentCulture
Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture
' ***
' insert your code here
' ***
Threading.Thread.CurrentThread.CurrentCulture = currentCulture

暫無
暫無

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

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