![](/img/trans.png)
[英].NET's JavaScriptSerializer.Deserialize() ignores decimal period in numbers from JSON
[英]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.