Strings zu Integers zu biegen ist eine Standardfunktion in jeder Programmiersprache. Doch wie funktioniert das? Mein Ansatz ist relativ einfach und beschränkt sich auf unsigned Ganzzahlen. Man nehme an:

123
|||
||>-3 * 10^0 =   3
|>--2 * 10^1 =  20
>---1 * 10^2 = 100
			 = 123

Was fällt auf? Im Dezimalsystem kann man sich relativ einfach einen Überblick über die verwendeten Ziffern machen und die dann aufeinander addieren. Das einzige, was noch fehlt, ist die Übertragung vom Zeichen 1 zur Ziffer/Zahl 1. Durch einen Key->Value-Store wie assoziative Arrays in PHP oder HashMaps in Java funktioniert das relativ gut. Man kommt also zu einem Quellcode, der aussieht wie unten beschrieben. Im Quellcode ist ein Haufen Enclosing, der verhindert, dass nicht-Ziffer-Zeichen in die neue Zahl kommen. Der größte Teil passiert erst in der convert()-Methode, die aufgerufen wird.

import java.util.HashMap;

public class CustomStringToInt {
	
	/**
	 * Initialize the HashMap with the decimal numbers.
	 *
	 * @return     The initialized HashMap.
	 */
	private static HashMap<Character, Integer> initCharToIntMap() {
		HashMap<Character, Integer> chars = new HashMap<Character, Integer>();
		
		chars.put('0', 0);		chars.put('1', 1);
		chars.put('2', 2);		chars.put('3', 3);
		chars.put('4', 4);		chars.put('5', 5);
		chars.put('6', 6);		chars.put('7', 7);
		chars.put('8', 8);		chars.put('9', 9);
		
		return chars;
	}
	
	/**
	 * @var chars The HashMap that was created in initCharToIntMap()
	 */
	private static HashMap<Character, Integer> chars = initCharToIntMap();
	
	/**
	 * Gets the int for this character. It is outsourced from the convert()
	 * method to catch java.lang.NullPointerException|s that might occur when
	 * requesting not mapped characters (e.g. in "12b3", b will return -1).
	 * Although removeNonDigits() should have thrown them out, I guess it's kind
	 * of good habit to catch this thing.
	 *
	 * @param      key   The "requested" character.
	 * @return     The int for character or -1 if character is not mapped.
	 */
	private static int getIntForChar(char key) {
		try {
			return chars.get(key);
		} catch (NullPointerException e) {
			return -1;
		}
	}
	
	/**
	 * Remove all non-digit characters from the string set. 
	 *
	 * @param      in    The raw string.
	 * @return     A string with digits only.
	 */
	private static String removeNonDigits(String in) {
		return in.replaceAll("[^\\d.]", "");
	}

	/**
	 * The callable Method which does the magic.
	 *
	 * @param      in    The String that comes in.
	 * @return     The unsigned integer that will come back.
	 */
	public static int convert(String in) {
		in = removeNonDigits(in);
		System.out.println(in);
		
		int result = 0;
		int exp = in.length() - 1;
		
		for(int i = 0; i < in.length(); i++) {
			int num = getIntForChar(in.charAt(i));
			if(num < 0) {
				continue;
			}
				
			result += num * Math.pow(10, exp);
			exp -= 1;
		}
		
		return result;
	}
	
}

Die fertige Methode kann dann über CustomStringToInt.convert("MeinTollerString123") aufgerufen werden und sollte 123 zurückliefern.

Avatar

Veröffentlicht am von Jannik

Technik

19 | der blasse, dünne Junge aus der Nachbarschaft | Macht Web Design, Theatertechnik und Pfadfinder | Ist #Wö‑Leiter | Studiert was mit Medien