hilpers


  hilpers > microsoft.* > microsoft.german.entwickler.dotnet.csharp

 #1  
20.01.2006, 13:01
Marvin Massih
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  
20.01.2006, 14:02
Herfried K. Wagner [MVP]
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  
20.01.2006, 14:03
Frank Dzaebel
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  
20.01.2006, 14:35
Marvin Massih
Hallo Herfried, hallo Frank,


Frank Dzaebel schrieb:
> IMHO musst Du da schon eigene Funktionen nutzen.


Danke für die Auskunft.

Gruß
Marvin
 #5  
20.01.2006, 14:42
Dave
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  
20.01.2006, 15:01
Thomas Scheidegger [MVP]
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  
20.01.2006, 16:04
Marvin Massih
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...


Alle Zeitangaben in WEZ. Es ist jetzt 03:36 Uhr. | Privacy Policy