2012-07-03 56 views

回答

3

不,沒有標準格式化程序。

如果您閱讀Wikipedia on Roman numerals,您會發現有多種格式化羅馬數字的方法。所以你必須編寫你自己的方法我們的use the code of someone else

+0

你肯定先生?因爲如果格式不能給我我需要的東西,我會抓住那個轉換器類。 – dpp

+0

我從未在框架中看到過一個:http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx這就是我的確信。 –

+0

考慮到爲此創建類的開發人員的數量。我認爲在Format函數中沒有希望。謝謝 – dpp

2

這是我在http://www.source-code.biz/snippets/vbasic/7.htm

(最初由先生基督教D'Heureuse在VB寫的)

發現我把它轉換成VB.net:

Private Function FormatRoman(ByVal n As Integer) As String 
     If n = 0 Then FormatRoman = "0" : Exit Function 
     ' there is no Roman symbol for 0, but we don't want to return an empty string 
     Const r = "IVXLCDM" ' Roman symbols 
     Dim i As Integer = Math.Abs(n) 
     Dim s As String = "" 

     For p As Integer = 1 To 5 Step 2 
     Dim d As Integer = i Mod 10 
     i = i \ 10 
     Select Case d ' format a decimal digit 
      Case 0 To 3 : s = s.PadLeft(d + Len(s), Mid(r, p, 1)) 
      Case 4 : s = Mid(r, p, 2) & s 
      Case 5 To 8 : s = Mid(r, p + 1, 1) & s.PadLeft(d - 5 + Len(s), Mid(r, p, 1)) 
      Case 9 : s = Mid(r, p, 1) & Mid(r, p + 2, 1) & s 
     End Select 
     Next 

     s = s.PadLeft(i + Len(s), "M") ' format thousands 
     If n < 0 Then s = "-" & s ' insert sign if negative (non-standard) 
     FormatRoman = s 
    End Function 

希望這將有助於他人。

乾杯 - 戴夫。

-1
Public Class RomanNumber 
    Public Shared Function FromNumber(val As Byte) As String 
     Return GetNumberToRoman(val) 
    End Function 
    Public Shared Function FromNumber(val As SByte) As String 
     Return GetNumberToRoman(val) 
    End Function 
    Public Shared Function FromNumber(val As Int16) As String 
     Return GetNumberToRoman(val) 
    End Function 
    Public Shared Function FromNumber(val As Int32) As String 
     Return GetNumberToRoman(val) 
    End Function 
    Public Shared Function FromNumber(val As UInt16) As String 
     Return GetNumberToRoman(val) 
    End Function 
    Public Shared Function FromNumber(val As UInt32) As String 
     Return GetNumberToRoman(val) 
    End Function 
    Public Shared Function ToByte(val As String) As Byte 
     Return GetNumberFromRoman(val) 
    End Function 
    Public Shared Function ToSByte(val As String) As SByte 
     Return GetNumberFromRoman(val) 
    End Function 
    Public Shared Function ToInt16(val As String) As Int16 
     Return GetNumberFromRoman(val) 
    End Function 
    Public Shared Function ToInt32(val As String) As Int32 
     Return GetNumberFromRoman(val) 
    End Function 
    Public Shared Function ToUInt16(val As String) As UInt16 
     Return GetNumberFromRoman(val) 
    End Function 
    Public Shared Function ToUInt32(val As String) As UInt32 
     Return GetNumberFromRoman(val) 
    End Function 
    Private Shared Function GetNumberToRoman(val As Integer) As String 
     Dim v As String = "" 
     Do While val > 0 
      If val >= 1000 Then 
       v &= "M" : val -= 1000 
      ElseIf val >= 900 Then 
       v &= "CM" : val -= 900 
      ElseIf val >= 500 Then 
       v &= "D" : val -= 500 
      ElseIf val >= 400 Then 
       v &= "CD" : val -= 400 
      ElseIf val >= 100 Then 
       v &= "C" : val -= 100 
      ElseIf val >= 90 Then 
       v &= "XC" : val -= 90 
      ElseIf val >= 50 Then 
       v &= "L" : val -= 50 
      ElseIf val >= 40 Then 
       v &= "XL" : val -= 40 
      ElseIf val >= 10 Then 
       v &= "X" : val -= 10 
      ElseIf val >= 9 Then 
       v &= "IX" : val -= 9 
      ElseIf val >= 5 Then 
       v &= "V" : val -= 5 
      ElseIf val >= 4 Then 
       v &= "IV" : val -= 4 
      Else 
       v &= "I" : val -= 1 
      End If 
     Loop 
     Return v 
    End Function 
    Private Shared Function GetNumberFromRoman(val As String) As Object 
     Dim v As Integer = 0 
     If val.Contains("IV") Then v += 4 : val = val.Replace("IV", "") 
     If val.Contains("IX") Then v += 9 : val = val.Replace("IX", "") 
     If val.Contains("XL") Then v += 40 : val = val.Replace("XL", "") 
     If val.Contains("XC") Then v += 90 : val = val.Replace("XC", "") 
     If val.Contains("CD") Then v += 400 : val = val.Replace("CD", "") 
     If val.Contains("CM") Then v += 900 : val = val.Replace("CM", "") 
     For Each c As Char In val 
      If c = "I" Then v += 1 
      If c = "V" Then v += 5 
      If c = "X" Then v += 10 
      If c = "L" Then v += 50 
      If c = "C" Then v += 100 
      If c = "D" Then v += 500 
      If c = "M" Then v += 1000 
     Next 
     Return v 
    End Function 
End Class 
+1

雖然這段代碼可能回答這個問題,但最好也提供一些解釋來解釋你的推理和它的作用。 – nalply

1

我寫了這段代碼,完美地工作達到一百萬。 你可以使用它,但請不要讓它成爲你自己的。

Public NotInheritable Class BRoman 
'Written by Bernardo Ravazzoni 
Public Shared Function hexRoman(ByVal input As Integer) As String 
    Return mainROMAN(input) 
End Function 
Private Shared Function mainROMAN(ByVal input As Integer) As String 
    Dim under As Boolean = udctr(input) 
    Dim cifretotali As Integer = input.ToString.Length 
    Dim output As String = "" 
    Dim remaning As String = input 
    Dim cifracor As Integer = cifretotali 
    While Not cifracor = 0 
     output = output & coreROMAN(division(remaning, remaning), cifracor) 
     cifracor = cifracor - 1 
    End While 
    If under Then 
     output = "-" & output 
    End If 
    Return output 
End Function 
Private Shared Function coreROMAN(ByVal num As Integer, ByVal pos As Integer) As String 
    Dim output As String = "" 
    Debug.WriteLine(num) 
    Select Case num 
     Case 1 To 3 
      output = say(num, getStringFor(True, pos)) 
     Case 4 
      output = getStringFor(True, pos) & getStringFor(False, pos) 
     Case 5 To 8 
      output = getStringFor(False, pos) & say(num - 5, getStringFor(True, pos)) 
     Case 9, 10 
      output = say(10 - num, getStringFor(True, pos)) & getStringFor(True, pos + 1) 
    End Select 
    Return output 
End Function 
Private Shared Function getStringFor(ByVal first As Boolean, ByVal index As Integer) As String 
    Dim output As String = "" 
    index = index * 2 
    If first Then 
     index = index - 1 
    End If 
    output = rGetStringFor(index) 
    Return output 
End Function 
Private Shared Function rGetStringFor(ByVal index As Integer) As String 
    Dim output As String = "" 
    Dim sy As Integer 
    If index < 8 Then 
     output = rrGetStringFor(index) 
    Else 
     sy = index \ 6 
     output = say(sy, rrGetStringFor(8)) & rrGetStringFor(((index - 2) Mod 6) + 2) & say(sy, rrGetStringFor(9)) 
    End If 
    Return output 
End Function 
Private Shared Function rrGetStringFor(ByVal index As Integer) As String 
    Dim output As String = "" 
    Select Case index 
     Case 1 
      output = "I" 
     Case 2 '8 
      output = "V" 
     Case 3 '9 
      output = "X" 
     Case 4 '10 
      output = "L" 
     Case 5 '11 
      output = "C" 
     Case 6 '12 
      output = "D" 
     Case 7 '13 
      output = "M" 
     Case 8 
      output = "[" 
     Case 9 
      output = "]" 
    End Select 
    Return output 
End Function 
Private Shared Function division(ByVal inputs As String, ByRef resto As String) As Integer 
    resto = "" 
    If inputs.Length > 1 Then 
     resto = inputs.Substring(1) 
    End If 
    Dim output As Integer = Integer.Parse(StrReverse(inputs).Substring(inputs.Length - 1)) 
    Return output 
End Function 
Public Shared Function say(ByVal index As Integer, ByVal letter As String) As String 
    Dim output As String = "" 
    While Not index = 0 
     output = output & letter 
     index = index - 1 
    End While 
    Return output 
End Function 
Public Shared Function udctr(ByRef num As Integer) As Boolean 
    Dim und As Boolean = (num < 0) 
    If und Then 
     num = 0 - num 
    End If 
    Return und 
End Function 
End Class 

使用功能hexRoman,像這樣的例子:

msgbox(Broman.hexRoman(50))