Carte du site
 Remerciements
 Netiquette
 Bugs
 Tables
 Requêtes
 Formulaires
 États (rapports)
 Modules
 APIs
 Chaînes
 Date/Time
 Général
 Ressources
 Téléchargeables

 Termes d'usage

Strings: Nom propres avec exceptions

Author(s)
Jay Holovacs

---Soumis par Jay Holovacs---

Nom propres avec exceptions.

    Voici un ensemble de fonctions qui permettent de manipuler certaines règles spéciales de noms propres. Étant modulaire, on peut ajouter des règles supplémentaires, si cela est opportun.

Par exemple, en ce moment, les cas suivants sont couverts:

Henry VIII.
O'Hara
Tom McHill

Appeler la fonction en lui fournissant la chaîne à transformer, en minuscules (l'argument original n'est pas modifié).

dim retval as string
retval=mixed_case("joe mcdonald")

'************** Code Start *************
'This code was originally written by Jay Holovacs. 
'It is not to be altered or distributed, 
'except as part of an application. 
'You are free to use it in any application,  
'provided the copyright notice is left unchanged.

'Ce code fut originalement écrit par Jay Holovacs. 
'Il ne doit pas être altéré ni distribué hormis
'comme inclus dans une application. 
'Vous êtes libre de l'utiliser dans n'importe quelle application,  
'en autant que vous laissiez cette note inchangée.

'
'Code Courtesy of
'Jay Holovacs
'
Public Function mixed_case(str As Variant) As String
'retourne la chaîne modifiée, comme un nom propre de personne
'
Dim ts As String, ps As Integer, char2 As String
    If IsNull(str) Then
        mixed_case = ""
        Exit Function
    End If
    If Len(str) = 0 Then
        mixed_case = ""
        Exit Function
    End If
    ts = LCase$(str)
    ps = 1
    ps = first_letter(ts, ps)
    special_name ts, 1
    'Commence par une majuscule?
    Mid$(ts, 1) = UCase$(left$(ts, 1))
    If ps = 0 Then
        mixed_case = ts
        Exit Function
    End If
    While ps <> 0
        If is_roman(ts, ps) = 0 Then
            'si ce n'est pas romain, appliquer les autres règles
            special_name ts, ps
            Mid$(ts, ps) = UCase$(Mid$(ts, ps, 1)) 'première lettre en majuscule
        End If
        ps = first_letter(ts, ps)
    Wend
    mixed_case = ts
End Function

Private Sub special_name(str As String, ps As Integer)
    'str une chaîne en minuscules, ps le début où on
    'commencer la vérification, retourne str modifié
    '
    Dim char2 As String
    char2 = Mid$(str, ps, 2) 'vérifie règle spéciales
    If (char2 = "mc" Or char2 = "o'") And Len(str) > ps + 1 Then 'genre Mc 
        Mid$(str, ps + 2) = UCase$(Mid$(str, ps + 2, 1))
    End If
End Sub

Private Function first_letter(str As String, ps As Integer) As Integer
'ps=starting point to search (starts with character AFTER ps)
'returns next first letter, 0 if no more left
Dim p2 As Integer, s2 As String
    s2 = str
    p2 = InStr(ps, str, " ") 'points to next blank, 0 if no more
    If p2 = 0 Then
        first_letter = 0
        Exit Function
    End If
    'first move to first non blank, non punctuation after blank
    While is_alpha(Mid$(str, p2)) = False
        p2 = p2 + 1
        If p2 > Len(str) Then 'we ran off the end
            first_letter = 0
            Exit Function
        End If
    Wend
    first_letter = p2
End Function

Public Function is_alpha(ch As String)
'returns true if this is alphabetic character
'false if not
    Dim c As Integer
    c = Asc(ch)
    Select Case c
        Case 65 To 90
            is_alpha = True
        Case 97 To 122
            is_alpha = True
        Case Else
            is_alpha = False
    End Select
End Function

Private Function is_roman(str As String, ps As Integer) As Integer
'commençant à la position  ps, jusqu'à la fin du mot. Si c'est un nombre
'romain, passer tout le mot en majuscules, autrement
'ne pas modifier la chaîne. Retourner 1 si des changements
'furent apportés, 0 autrement.
Dim mx As Integer, p2 As Integer, flag As Integer, i As Integer
    mx = Len(str) 'jusqu'où aller
    p2 = InStr(ps, str, " ") 'vérifier s'il y a un autre espace après ce mot
    If p2 = 0 Then
        p2 = mx + 1
    End If
    'vérifier s'il n'y a aucun caractère non approprié
    flag = 0
    For i = ps To p2 - 1
        If InStr("ivxIVX", Mid$(str, i, 1)) = 0 Then
            flag = 1
        End If
    Next i
    If flag Then
        is_roman = 0
        Exit Function 'c'est un chiffre romain 
    End If
    Mid$(str, ps) = UCase$(Mid$(str, ps, p2 - ps))
    is_roman = 1
End Function
'************** Code End  *************

© 1998-2001, Dev Ashish, All rights reserved. Optimized for Microsoft Internet Explorer