2016-10-12 3 views
2

Ich speicher viele Werte in localStorage für eine App und benötigte eine Möglichkeit, die "Zeichenfolge" zurück in eine Zahl zu konvertieren - WENN es eine Zahl war. Wenn Sie das Feld HTML <input type="number"> on your form, then the data going into the form and extracted from the form IS a number, but once stored - its converted to a string. So to repopulate that später erzwingen, müssen Sie den localStorage-Wert lesen und ihn in eine Zahl konvertieren, bevor Sie das Eingabefeld neu füllen. Andernfalls erhalten Sie eine Menge Warnungen und manchmal Fehler, da NUMBERS erwartet werden, localStorage jedoch Strings abrufenZahlen aus localStorage als Zahlen extrahieren

Meine Methode: Angenommen, der Wert wird als Zahl eingegeben, dann wird nur eine Zahl (nur Ziffern) gespeichert - Sie können also davon ausgehen, dass nur Zahlen ausgegeben werden (auch wenn es sich um eine Zeichenfolge handelt). nur Zahlen zu wissen, ermöglicht dies kommt zurück:

var allVariables = {} ; 
var reg = new RegExp(/^\d+$/) ; // this accounts for digits only 
for (var x=0; x<localStorage.length;x++) { 
    var keyValue = localStorage.getItem(localStorage.key(x)) ; 
    if (reg.text(keyValue)) { 
    keyValue = parseInt(keyValue) ; 
    } 
    allVariables[localStorage.key(x)] = keyValue ; 
} 

ich auch auf diese erweitert für wahr/falsch booleans erklären ... kann 0/1 nicht einfach verwenden, ohne mit einer Reihe verwirrt. Eine andere Methode, die ich gesehen habe unterstreicht den Schlüsselnamen der typeof für eine spätere Umwandlung zu identifizieren:

dh:

key1_str 
key2_boo 
key3_int 
key4_obj 
key5_flo 

Dann identifizieren die „_xxx“ angemessen, diesen Wert zu konvertieren.

Ich bitte darum, dass andere mit diesem Problem oder mit Vorschlägen und Empfehlungen zur Verbesserung konfrontiert werden. Meiner ist nicht perfekt ... obwohl weder localStorage ... noch auf der Suche nach Verbesserungen ist.

+0

speichern Sie es als JSON – Dimava

+0

nicht sicher, dass entweder funktionieren würde, weil die localstorage die Nummer 12345 als „12345“ gespeichert hat. Importieren oder speichern Sie es als JSON (ohne Konvertierung) würde es immer noch als: '" Key ":" 12345 "' versus: '" key ": 12345' – rolinger

+0

@rolinger nicht wahr ... kopiere meine Antwort auf Ihre Konsole und run it – charlietfl

Antwort

3

Anstatt viele einzelne Schlüssel zu speichern, können Sie ganze Objekte auf weniger Speicherschlüssel speichern, die Sie nach json und Beim Abrufen parsen. JSON Methoden behält Typ

var obj= { 
    id:100, 
    anotherProp:'foo' 
} 

localStorage.setItem('myObj',JSON.stringify(obj)); 
var newObj = JSON.parse(localStorage.getItem('myObj')); 
console.log(typeof newObj.id)//number 
+0

Interessant. Ich werde es versuchen. Das gesamte Objekt wird als String gespeichert, aber innerhalb des Objekts haben verschiedene Schlüssel/Werte keine Anführungszeichen um sie herum. Daher sollte beim Extrahieren der Datentyp beibehalten werden. – rolinger

+0

yes ... correct ... selbe für 'true' und' false' oder 'null', die Sie auch beim Speichern als String konvertieren müssen – charlietfl

+0

auch viel einfacher zu verfolgen, was in Ihrem localStorage ist, wenn Sie es suchen manuell in Dev-Tools, wenn Sie es häufig auf der gleichen Website verwenden – charlietfl

0

nehme an, Sie "keyName" : "12345" haben. Tricky Lösung ist var newInt = +localStorage.getItem('keyName') dieses Extra + wird die Zeichenfolge in Ganzzahl konvertieren.

+0

Nicht alle Schlüssel/Werte sind Zahlen, aber wie behandelt + eine echte Zeichenfolge? Das obige wird für die Zahl ausgewertet und dann falls nötig konvertiert, andernfalls wird es in Ruhe gelassen. 'var a =" 12345abcdef "; var newInt = + a; '??? – rolinger

+0

Ich habe ein Beispiel erwähnt. Dieses + konvertiert nur den String in Integer, wenn die Zahlen in einem String gebildet werden. Verwenden Sie es, wenn Sie sicher sind, dass der Wert nur Zahlen in Zeichenfolgenform enthält. Auf Ihrem zweiten Kommentar erwähnten Sie eine ähnliche Datenstruktur. –

0

versuchen zu konvertieren:

function getProbablyNumberFromLocalStorage(key) { 
    var val = localStorage.getItem(key); 
    return (isNan(+val) || val==null) ? val : +val; 
} 
Verwandte Themen