2015-03-31 28 views
0

我的代碼,簡單的幾行:演員到雙忽略小數點

var 
    vRecordValue:Double; 
begin 
    vRecordValue:= someVariant; 

凡someVariant是一個字符串(類型256)。

在生產系統上,我們有'23.4'的變體,vRecordValue變成了234.我只能重現這是我的系統分隔符是','。在我們的生產系統中,情況就是這樣,但我們已經改變了設置並仍然看到了這種情況。有趣的是,除了在調試模式下(不知道這裏的關係是什麼),並且通過一個簡單的測試,我們無法重現這一點。

我有一個明確的轉換解決了這個問題:

vRecordValue:= StrToFloatDef(VarToStrDef(someVariant, '0'), 0); 

問題:

  1. 是否有任何其他的方式,一個小數點可以被忽略?
  2. 有人可以請提供一個參考,瞭解如何執行從字符串到雙精度的默認投射?我想了解其中的差異。
  3. 有沒有什麼辦法可以讓默認轉換中使用的分隔符從代碼第一次運行時的值中緩存? ......令人懷疑但絕望的理解。

感謝,

韋恩。

+0

你有沒有檢查你的區域設置?在這種情況下,我不會依賴特定的語言環境設置,而是使用固定的(英語)語言環境來執行此類任務似乎很合適 - – JensG 2015-03-31 08:07:28

+0

謝謝。抱歉。我應該更清楚。當我說分隔符是逗號時,這是來自語言環境設置。我們的生產體系​​在阿爾巴尼亞,這就是爲什麼我們認爲我們遇到了這個問題。 – wayju 2015-03-31 09:38:01

+0

你究竟在做什麼? – 2015-03-31 19:45:50

回答

1

這是你的區域設置

我做了這個samall演示applikation序爲測試它:

procedure TForm60.FormCreate(Sender: TObject); 
var 
    vRecordValue: Double; 
    sRecordValue: Variant; 
begin 
    sRecordValue:= '23.4'; 
    vRecordValue:= StrToFloatDef(VarToStrDef(sRecordValue, '0'), 0); 
    ShowMessage(FloatToStr(vRecordValue)); 

    sRecordValue:= '23,4'; 
    vRecordValue:= StrToFloatDef(VarToStrDef(sRecordValue, '0'), 0); 
    ShowMessage(FloatToStr(vRecordValue)); 
end; 

在丹麥(我住的地方)的,我們使用,如小數分隔符,所以最後一個給我正確的結果

+0

謝謝Jens。我做了類似的測試,發現了同樣的問題。但是我不明白的是,爲什麼在修改我們的系統配置(將它從逗號改成點)後,問題沒有消失。還有什麼你可以想到會導致這個問題?或者可以以某種方式緩存配置?我們已經重新啓動服務器。 – wayju 2015-03-31 09:41:18

+0

爲了解決問題,我必須接受這個答案。這也是我在測試中發現的,但與我們生產服務器的明顯配置不匹配。 我們在我的第一個問題中提到了顯式轉換的修補程序,它似乎可以在我們的生產服務器中使用。感謝大家的幫助。 – wayju 2015-04-08 03:29:05

+0

我的帖子在下面解釋了爲什麼更改設置不起作用......因爲我們沒有改變它爲運行該服務的用戶! – wayju 2015-08-06 02:53:21

1

關於我的第三個問題。這個問題在本週再次發生。我沒有意識到只會爲當前用戶設置區域設置/區域設置。

複製系統的用戶的設置,我們需要使用:

控制面板>區域和語言選項>管理>複製設置。

這就是測試時出現不一致的原因。它取決於我的應用程序正在運行的用戶以及用戶設置。