2 november 2010

GREP die bedragen (tientallen, honderdtallen etc.) vindt


Een vraag die al een tijd geleden is gesteld, maar waar ik nu pas een goeie GREP voor heb (ik moest het namelijk zelf gebruiken ;-) ):

Probleem: vind bedragen die tientallen, honderdtallen, duizendtallen etc. bevatten, met een euro-teken, en mogelijk een spatie, geen spatie, of een smalle/dunne etc. spatie dan wel een tab achter het euro-teken:

€ 1,00

€ 23,12

€ 123,45

€ 5.234,56

€ 16.234,56

€ 516.234,56

12,34

€ 123,45

€ 1.234,56


gebruik de volgende GREP:


\€s?\d{1,3}(.\d{3})*\,\d\d


Maar...toen moest ik nog wat verzinnen voor een bedrag met een half kastlijntje in plaats van twee nullen...


€ 12,–


Dat wordt dan:


\€s?\d{1,3}(.\d{3})*\,(\d\d)?(~=)?


Maar deze werkt net zo goed:


(\€s?)(\d+?)(\.?)(\d+)(\,)(\d\d)?(~=)?


Maar nog beter, vang af ongeacht hoeveel je in de miljoenen, miljarden etc. duikt door een voorwaardelijke herhaling ( de onderstaande is dus de beste definitieve reeks):


((\d+)?(\.?))+(\d{1,3})?,(~=)?(\d{1,2})?



Een variant: van Europese schrijfwijze naar Engelse schrijfwijze: daar moeten de punten en komma's precies andersom staan.

Ik neem nu even niet de valuta mee (dus een GREP zonder het Euro teken):


Zoek naar:


(\d{1,3})*(.)(\d{3})*(\,)(\d\d)


Vervang door:

$1,$3.$5


Wil je andersom van Engels naar Europees dan moet je in beide uitdrukkingen de komma en punt simpelweg omwiselen in de GREP.

De GREP van Europees naar Engels kan nog wel wat beter want deze GREP gaat ervan uit dat er en een punt en een komma in het bedrag staan (alleen komma's worden wel gevonden maar niet goed vervangen) en het halve kastlijntje zit er ook niet in. Maar: het is een begin en er is vast wel iemand onder de lezers die de GREP kan aanpassen voor gewenste doeleinden ;-)

NOOT: er bestaan twee aparte GREPS die bij InDesign worden meegeleverd om eerst decimalen dan honderdtallen en duizendtallen om te zetten van Europees naar Engels.

Ik heb ze wat aangepast om ook n-dashes te vinden, maar het blijft een twee-traps-raket:
EERST (!!) decimalen vinden:

,((\d{2})?(~=)?)


vervang

.$1


Vervolgens (!!) duizendtallen:

zoek:


\.(\d{3})


vervang:

,$1


NOOT: Deze twee kun je nou mooi in één handeling verrichten met Multi-FindChange - zie mijn blogbericht hier. (zie filmpje hieronder voor Multi-Findchange).







1 opmerking:

Wim Ruberg zei

Het wordt pas een echt probleem als het bij het omzetten van Engels naar Nederlands van de getallen om miljoenen gaat en er dus 2 groepen van 3-cijfers met een comma worden gebruikt. Dan ben je toch weer aangewezen op de 2-traps raket en biedt de chain-queries script van Peter Kahrel weer uitkomst...

http://www.kahrel.plus.com/indesign/chain_queries.html