2014-01-16 56 views
0

我有一個數據文件,其中未指定小數點的小數點。該數字剛剛在數據文件的佈局中描述爲前兩位數字爲實數,後兩位數字爲小數,並且它隨不同字段,實數和小數部分而變化自定義舍入邏輯 - VB腳本 - QTP

所以實際數字12345.6789被指定爲123456789。當我想這是四捨五入至小數點後2分,以匹配應用的價值,我使用下面的邏輯

Public Function Rounding(NumberValue, DecimalPoints, RoundOff) 

     Rounder= Roundoff+1 
    Difference = DecimalPoints - Rounder 
    NumberValue = Mid(NumberValue, 1, Len(NumberValue)-Difference) 

    RealNumber=Mid(NumberValue,1,Len(NumberValue)-Rounder) 
    DecimalNumber=Right(NumberValue,Rounder) 

    NumberValue = RealNumber&"."&DecimalNumber 
    NumberValue = Cdbl(NumberValue) 
    NumberValue = Round(NumberValue, Roundoff) 
    Rounding = FormatNumber(NumberValue,Difference+1,,,0) 

End Function 

的但這個邏輯的問題是,我不能夠當四捨五入小數數具有0作爲十進制值

舉例來說,讓我們取12345.0000,我想四捨五入到2小數點

我的函數返回它作爲12345,而我希望這是返回爲12345.00

這個邏輯怎麼可能進行調整,以獲得所需的輸出任何想法或者是不可能的呢?

+0

嗨,我誤解你的問題。你能否提供一個你如何稱呼你的功能的例子;例如:對於你的最後一個例子,它會被稱爲舍入(123450000,2,3)? – Damien

+0

直到現在沒有注意到這一點。我糾正了這個問題。感謝您提出了FormatNumber函數。我已經更新了代碼。我打電話號碼爲NumberValue =舍入(NumberValue,4,2)。 4 - 小數位數。 2是我想要的號碼 –

回答

1

要獲得小數,使用Formatnumber功能。請參閱http://msdn.microsoft.com/en-us/library/ws343esk(v=vs.84).aspx - 默認值通常是2位小數,但在使用默認值時它是區域設置特定的。

如果小數點變量與舍入變量相匹配,那麼您的腳本也有一個小問題 - 它不會填充Rounding並顯示結果。我也不確定你爲什麼要比較小數點和舍入(-1)?

我已經修改了全部程序 - 它應該做你想做的(雖然我不知道你是餵養它什麼值) - 所以現在它的工作是這樣的:


做4位數:

舍入(123450001,4,2)

結果:

12345.00


否則2位數:

舍入(123450001,2,2)

結果:

1234500。01


否則4個數字(如果遞增> 0.5)

舍入(876512345678,8,4)

結果:

8765.1235

修訂簡化功能應該做的一切你都在問:

Public Function Rounding(NumberValue, DecimalPoints, RoundOff) 

    RealNumber = Mid(NumberValue, 1, Len(NumberValue)-DecimalPoints) 
    DecimalNumber = Round("." & Right(NumberValue,DecimalPoints), RoundOff) 
    Rounding = FormatNumber(RealNumber + DecimalNumber,RoundOff,,,0) 

End Function 

這是你的函數的一個工作版本:

Public Function Rounding(NumberValue, DecimalPoints, RoundOff) 

    RealNumber=left(NumberValue,Len(NumberValue)-DecimalPoints) 
    DecimalNumber="." & Right(NumberValue,DecimalPoints) 
    NumberValue = RealNumber + DecimalNumber 
    NumberValue = Round(NumberValue,RoundOff) 
    Rounding = FormatNumber(NumberValue, RoundOff,,,0) 

End Function 
+0

感謝您的輸入。代碼是相反的方式小數點表示總數,舍入表示實際需要的小數。將Decimalpoints等同於舍入的原因是爲了確保在兩個位置插入相同數字時代碼不會失敗。當調用函數本身而不是處理它的功能時,應該將其消除,因此我將刪除它。我用你的代碼,但它似乎並沒有工作,但我從來沒有使用格式編號功能,所以我會得到它的嘗試 –

+0

好吧 - 我很好奇,如果它的工作,如果你要調用的功能相反,例如四捨五入(「123450000」,2,4)....我將改變例行程序以確保它讀取的是數字而不是字符串。當你說它不起作用,你是否得到一個錯誤,或者它只是沒有返回正確的值? – Damien

+0

我沒有收到錯誤,但沒有返回正確的值 –

1

我敢肯定,你將無法使用Round()函數來滿足你的需求。查看FormatNumber()或FormatCurrency()函數,因爲它們可以選擇「IncludeLeadingZero」。

從下面的鏈接瞭解更多信息,答案請看:

vbscript round to 2 decimal places using Ccur