Miksi trim () EI poista hiiltä 160?
On tammikuu 31, 2021 by admin Minulla on skenaario, jossa PicklistEntry
-tunniste sisältää merkin 160 (ei katkaisematonta tilaa) arvon loppu. Joten kun soitan pe.label.getChars()
, taulukon lähtö on seuraavat merkit: (104, 101, 108, 108, 111, 160)
.
Jos soitan trim()
sitten getChars()
, odotan, että jäljellä oleva 160 merkki poistetaan. Ei. Kun käytän merkkiä 32, trim()
poistaa sen oikein.
Lisäksi normalizeSpace()
-toiminnon avulla poistat merkin 160 .
Pääkysymykseni on siis, miksi ”t trim()
ei poista tätä merkkiä, kun normalizeSpace()
poistaa?
Katso alla oleva koodiesimerkki.
// get "hello " from character array using 160 for space String hello = String.fromCharArray(new Integer[] { 104, 101, 108, 108, 111, 160 }); System.debug("==>" + hello.trim()); //output ==> "hello " // get "hello " from character array using 32 for space hello = String.fromCharArray(new Integer[] { 104, 101, 108, 108, 111, 32 }); System.debug("==>" + hello.trim()); //output ==> "hello" // get "hello " from character array using 160 for space and call normalizeSpace() hello = String.fromCharArray(new Integer[] { 104, 101, 108, 108, 111, 160 }); System.debug("==>" + hello.normalizeSpace()); //output ==> "hello"
MUOKKAA Lisäksi, kun soitan normalizeSpace()
, merkki 160 muunnetaan itse asiassa merkiksi 32. Joten 160: n ja 32: n täydellisen leikkaamiseksi minun on soitettava normalizeSpace().trim()
String hello = String.fromCharArray(new Integer[] { 104, 101, 108, 108, 111, 160 }); String normalized = hello.normalizeSpace(); System.debug("==>" + normalized); //output ==> "hello" System.debug("==>" + normalized.getChars()); //output ==> (104, 101, 108, 108, 111, 32)
Vastaa
dokumentaatio leikkauksessa sanoo:
ASCII-ohjainmerkit, kuten välilehdet ja uuden rivin merkit, ovat poistettiin myös. Välilyöntiä ja ohjausmerkkejä, jotka eivät ole lauseen alussa tai lopussa, ei poisteta.
Kirjaimellisesti ottaen vain välilyönti (ASCII 32), välilehti (ASCII 9), rivinvaihto (ASCII 10) ja vaunun paluu (ASCII 13) poistettaisiin jättää muut tyhjät tilat, kuten rikkomaton tila, nollaleveys ja niin edelleen. Tämä johtuu todennäköisesti siitä, että trim on hyvin vanha menetelmä, joka juontaa juurensa Apexin alkuun, kun taas normalizeWhitespace on suhteellisen uusi.
Nopeana vaihtoehtona, jonka pitäisi tehdä mitä haluat:
// get " hello " from character array using 160 for space String hello = String.fromCharArray(new Integer[] { 160, 104, 101, 108, 108, 111, 160 }); System.debug("==>"" + hello.replaceAll("^\\p{IsWhite_Space}+|\\p{IsWhite_Space}+$","")+"""); //output ==>"hello"
^\\p{IsWhite_Space}+|\\p{IsWhite_Space}+$
. Lisää ' vastaukseen esimerkki sinulle.