|
|
||||||
|
#1
|
|
|
|
|
Hallo,
ich muss Zahlen zwischen Basis 10 und Basis 36 (0-9, A-Z) hin und her konvertieren. Derzeit verwende ich selbstgeschriebene Methoden. Aber bringt das Framework vielleicht schon eigene Methoden mit? Gruß Marvin |
|
|
|
#2
|
|
|
|
|
Hallo Marvin!
"Marvin Massih" <news> schrieb: > ich muss Zahlen zwischen Basis 10 und Basis 36 (0-9, A-Z) hin und her > konvertieren. > Derzeit verwende ich selbstgeschriebene Methoden. > Aber bringt das Framework vielleicht schon eigene Methoden mit? Ich fürchte nein. 'Convert.ToInt32' funktioniert nur mit bestimmten Basen, aber nicht mit Basis 36. |
|
#3
|
|
|
|
|
Hallo Marvin,
> ich muss Zahlen zwischen Basis 10 und Basis 36 (0-9, A-Z) hin und her > konvertieren. > Derzeit verwende ich selbstgeschriebene Methoden. > Aber bringt das Framework vielleicht schon eigene Methoden mit? Die werden vom Framework nur die Basen 2, 8, 10 oder 16 direkt unterstützt (Klasse Convert). IMHO musst Du da schon eigene Funktionen nutzen. ciao Frank |
|
#4
|
|
|
|
|
Hallo Herfried, hallo Frank,
Frank Dzaebel schrieb: > IMHO musst Du da schon eigene Funktionen nutzen. Danke für die Auskunft. Gruß Marvin |
|
#5
|
|
|
|
|
Hallo Marvin.
Ich weis nicht wie Mathematisch korrekt oder optimierbar - aber hier mein Basis 10 zu 26 und zurück algo.: public class Coordinates { public static string CoordToExcel(int x, int y) { x++; y++; //Ich beginne mit 0 zu zählen - Excel mit 1 string Excel = ""; while(x>0) { if(x%26==0) //Special Case! { Excel = "Z" + Excel; x--; } else { byte[] arr = new byte[1]; arr[0] = byte.Parse(((int)(64 + x%26)).ToString()); Excel = System.Text.Encoding.ASCII.GetString( arr ) + Excel; } x = (int)Math.Floor( x / 26); } Excel += y.ToString(); //Add y Part return Excel; //DID IT!!! WORKS!!! } public static void ExcelToCoord(string Excel, out int x, out int y) { x = 0; y = 0; byte[] bExcel = System.Text.Encoding.ASCII.GetBytes(Excel); int l = bExcel.Length; int i=0; for(;i<l;i++) { if(bExcel[i] < 65 || bExcel[i] > 90) { break; } //64 < x < 91 == CHAR } for(int j=0;j<i;j++) { x += (int)Math.Pow(26,i-(j+1)) * (bExcel[j]-64); } for(int j=i;j<l;j++) { //48 - 57 y += (int)Math.Pow(10,l-(j+1)) * (bExcel[j] - 48); } x--; y--; } } |
|
#6
|
|
|
|
|
Hallo Marvin
> Zahlen zwischen Basis 10 und Basis 36 (0-9, A-Z) hin und her konvertieren. Eine ähnliche minimal-Lösung dazu hatte ich mal schon früher geschrieben, geht auf diese Art wegen Assymetrie nicht für die negative Zahl = Int32.MinValue. Ohne Gewähr: // ================================================== // sample call: int n = Parse( "-XyZ", 36 ); // = -44027 decimal string r = ToString( n, 36 ); // -------- public static int Parse( string text, int fromBase ) { int l = text.Length - 1; int s = 0; if( text[0] == '-' ) s++; int number = 0; for( int i = s; i <= l; i++ ) { int ch = (int) text[ i ]; if ((ch >= 48) && (ch <= 57)) ch = ch - 48; else if ((ch >= 65) && (ch <= 90)) ch = ch - 55; else if ((ch >= 97) && (ch <= 122)) ch = ch - 87; else ch = Int32.MaxValue; if( ch >= fromBase ) throw new ArgumentException("Invalid char"); number = number * fromBase + ch; } if( s == 1 ) number = -number; return number; } // ---------- public static string ToString( int number, int toBase ) { char[] ach = new char[15]; bool neg = false; if( number < 0 ) { neg = true; number = Math.Abs( number ); } int i = ach.Length; int rmd; do { number = Math.DivRem( number, toBase, out rmd ); if( rmd >= 10 ) ach[ --i ] = (char)(rmd + 55); else ach[ --i ] = (char)(rmd + 48); } while( number != 0 ); if( neg ) ach[ --i ] = '-'; return new String( ach, i, ach.Length - i ); } // ================================================== |
|
#7
|
|
|
|
|
Hallo Thomas, hallo Dave,
Thomas Scheidegger [MVP] schrieb: [Algorithmus zum Konvertieren] Na, dann hier auch noch meine Methoden (hoffe, die Formatierung haut hin): ====== SCHNIPP ====== private static int Pow36(int exp) { int retVal = 1; if(exp >= 0) { for(int i=0; i < exp; i++) { checked { retVal *= 36; } } } else { throw new ArgumentOutOfRangeException("exp must not be negative"); } return retVal; } public static int Base36To10(string val) { if(val == null) { throw new ArgumentNullException("val must not be null"); } int retVal = 0; string str = val.ToUpper(); int n = str.Length; if(n <= 0) { throw new ArgumentException("val must not be empty"); } int exp = n - 1; for(int i=0; i < n; i++, exp--) { int cur = 0; char c = str[i]; if(c >= '0' && c <= '9') { cur = (c - '0'); } else if(c >= 'A' && c <= 'Z') { cur = 10 + (c - 'A'); } else { throw new FormatException("Not a valid base36 value: " + val); } checked { int pow = Pow36(exp); retVal += (cur * pow); } } return retVal; } public static string Base10To36(int val) { if(val < 10) { return val.ToString(); } else if(val < 36) { return new string((char)('A' + (val - 10)), 1); } else { string str = ""; while(val > 0) { int rem = val % 36; str = Base10To36(rem) + str; val /= 36; } return str; } } ====== SCHNAPP ====== Gruß Marvin |
|
|
| Ähnliche Themen | |
| eco basis Hallo! Mir stellt sich folgende Frage: Wenn ich ein neues DECT-Telefon mit ECO-Modus kaufe und an dieser neuen Basisstation Mobilteile anmelde, die nicht diesen Modus... |
|
| [OT] Mantisse+Exponent von Basis 2 zu Basis 10 wandeln Hi, wer weiss, wie das in der Regel umgesetzt wird? Eingabe: Mantisse + Exponent als Integerzahlen (binär, zur Basis 2) Ausgabe: String mit Floatingpointzahl zur Basis... |
|
| Basis Hallo zusammen, ich bin seit ein Paar Jahren selbständig und bin bisher allein zurecht gekommen. Nun möchte ich meinem Kumpel einen eher kleinen Auftrag geben, zunächst... |
|
| Basis und duale Basis Hallo, zu einer Basis b_i eines Vektorraums V laesst sich doch mit einer einfachen Vorschrift v_i(b_j)=delta_ij die duale Basis des Vektorraums V* bilden. Laesst sich das... |
|
| Basis URL Beim speichern meiner Kopf.html erscheint die Fehlermeldung "Sie haben eine Basis-URL definiert. Bitte speichern Sie alle Bilder neu ab. (SO ungefähr) Komme hier zu keinem... |
|
|
Alle Zeitangaben in WEZ. Es ist jetzt 21:52 Uhr. | Privacy Policy
|