Skriv ut tal som text

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}

"Performance counter registry hive consistency check" failed

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]_