by Martin
27. September 2010 11:27
En fd kollega till mig stötte på ett problem där han ville skriva ut ett tal i textform, ungefär som det brukar stå på presentkort osv, t ex så 112 etthundraelva.
Han googlade lite, hittade [url:en blogg där någon skrivit en kodsnutt för det i SQL|http://www.novicksoftware.com/udfofweek/Vol2/T-SQL-UDF-Vol-2-Num-9-udf_Num_ToWords.htm], men valde sedan att konvertera det till att använda i Reporting Services istället. Klistra in koden nedan under Custom code och anropa sedan koden i rapporten enligt följande:
{{
=Code.ExpandPrice(Fields!Amount.Value,",")
}}
Kod:
{code:vb.net}
Shared suffixes As String() = _
{"Tusen", "Miljoner", "Miljarder", "Biljoner", "Biljard", "Triljon", "Triljard"}
Shared units As String() = _
{"", "Ett", "Två", "Tre", "Fyra", "Fem", "Sex", "Sju", "Åtta", "Nio"}
Shared tens As String() = _
{"Tjugo", "Trettio", "Förtio", "Femtio", "Sextio", "Sjuttio", "Åttio ", "Nittio"}
Shared digits As String() = _
{"Tio ", "Elva ", "Tolv ", "Tretton ", "Fjorton ", "Femton ", "Sexton ", "Sjutton ", "Arton ", "Nitton"}
Shared expr As New _
System.Text.RegularExpressions.Regex("^-?\d+(\,\d{2})?$", _
System.Text.RegularExpressions.RegexOptions.None)
Public Function ExpandPrice(ByVal Price As Double, Optional ByVal pSeparator As String = ".") As String
Dim pPrice As String
pPrice = FORMAT(Price, "##############.00")
Dim temp As New System.Text.StringBuilder()
If expr.IsMatch(pPrice) Then
Dim parts As String() = pPrice.Split(pSeparator)
Dim dollars As String = parts(0)
Dim cents As String = parts(1)
If CDbl(dollars) >= 1 Then
temp.Append(ExpandIntegerNumber(dollars) & "Kronor")
ElseIf CDbl(dollars) = 0 Then
temp.Append(ExpandIntegerNumber(dollars) & "Noll Kronor")
End If
If CDbl(cents) >= 1 Then
temp.Append(" och ")
temp.Append(ExpandIntegerNumber(cents) & " Öre")
End If
End If
Return temp.ToString()
End Function
Function ExpandIntegerNumber(ByVal pNumberStr As String) As String
Dim temp2 As New System.Text.StringBuilder()
Dim number As String = StrDup(3 - Len(pNumberStr) Mod 3, "0") & pNumberStr
Dim i As Integer, j As Integer = -1
Dim numPart As String
For i = Len(number) - 2 To 1 Step -3
numPart = Mid(number, i, 3)
If CLng(numPart > 0) Then
If j > -1 Then
temp2.Insert(0, suffixes(j), 1)
End If
End If
temp2.Insert(0, GetNumberUnder1000Str(numPart), 1)
j += 1
Next
Return temp2.ToString()
End Function
Function GetNumberUnder1000Str(ByVal pNumber As String) As String
Dim temp1 As New System.Text.StringBuilder()
If Len(pNumber) = 3 Then
If CLng(Left(pNumber, 1)) > 0 Then
temp1.Append(GetNumberUnder100Str(Left(pNumber, 1)) & "Hundra")
End If
End If
temp1.Append(GetNumberUnder100Str(Right("0" & pNumber, 2)))
Return temp1.ToString()
End Function
Function GetNumberUnder100Str(ByVal pNumber As String) As String
If pNumber > 19 Then
Return tens(Left(pNumber, 1) - 2) & units(Right(pNumber, 1))
ElseIf pNumber >= 10 And pNumber <= 19 Then
Return digits(Right(pNumber, 1))
Else
Return units(Right(pNumber, 1))
End If
End Function
{code:vb.net}
by Martin
6. September 2010 14:37
Vid installation av SQL Server 2008 R2 fick jag ovanstående fel under fasen "Setup Support Rules".
Efter att ha surfat runt mycket hamnade jag slutligen [url:här|http://www.microtom.net/?p=500].
För att kunna gå vidare måste du först ta reda på vilken Locale ID som din Windowsinstallation körs på. Det är i korthet vilket språk du installerat. Det kan du enkelt göra genom att skapa ett console-projekt i Visual Studio och klistra in följande kod:
{code:c#}
string st=string.Format("{0,3}", CultureInfo.InstalledUICulture.Parent.LCID.ToString("X")).Replace(" ", "0");
System.Console.WriteLine(st);
System.Console.ReadLine();
{code:c#}
I mitt fall fick jag _009_ och jag kör engelskt Windows.
Jag laddade sedan ner [url:denna fil|http://www.martinfranson.se/file.axd?file=2010%2f9%2fPerflib.zip] (en zippad .reg-fil) och ändrade på rad 9 så istället för texten
{{
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\007]
}}
står det
{{
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009]
}}
_009_ är då mitt Locale ID som jag tog reda på tidigare.
Efter att ha lagt in detta i windows-registret så gick det utmärkt att fortsätta installationen.
_Källa: [url:http://www.microtom.net/?p=500]_