TRATAR STRING COM CARACTERES . ? !

 Tópico anterior Próximo tópico Novo tópico

TRATAR STRING COM CARACTERES . ? !

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#430525 - 30/10/2013 10:00:23

PROGRAMADORVB6
LISBOA
Cadast. em:Janeiro/2004


Última edição em 30/10/2013 10:01:41 por PROGRAMADORVB6

Olá bom dia.
Tenho esta função, mas não estou conseguindo que quando aparece os caracteres (.?!) , caso seja letra que venha a seguir, a coloque com um espaço e com a letra em  maiúscula.

Private Function Formatar_Texto(ByVal Input As String) As String
        Dim Posicao_Caracter As Integer
        Dim Monta_String As String = String.Empty
        Dim sChar As String = ""
        Dim i As Integer

        For i = 0 To Input.Length - 1

            sChar = Input.Substring(i, 1)
            Select Case sChar
                Case ".", "?", "!"
                    If Char.IsWhiteSpace(Input.Substring(Posicao_Caracter + 1, 1)) AndAlso Char.IsLower(Input.Substring(Posicao_Caracter + 2, 1)) Then

                        Monta_String = String.Concat(Monta_String, sChar & " " & Input.Substring(Posicao_Caracter + 2, 1).ToUpper(currentCulture))


                        i += 2
                        Exit Select

                    End If

                Case Else
                    Monta_String = String.Concat(Monta_String, sChar.ToString(currentCulture))
                    MsgBox(Monta_String)

            End Select
            Posicao_Caracter += 1
        Next
        Return Monta_String
    End Function  


Obrigado pela vossa atenção.

______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.


#430533 - 30/10/2013 12:50:18

TUNUSAT
SAMPA
Cadast. em:Dezembro/2003


PROGRAMADORVB6,

     Parece que o problema é simples.
     Os caracteres (.?!) que aparecem como ÚLTIMO caracter da frase quando o problema aparece pois entram na "if" abaixo:


If Char.IsWhiteSpace(Input.Substring(Posicao_Caracter + 1, 1)) AndAlso Char.IsLower(Input.Substring(Posicao_Caracter + 2, 1)) Then


     E o problema ocorre quanto tentamos somar mais um (Posicao_Caracter + 1)  ao tamanho máximo da "Posicao_Caracter".
     Para resolver o problema, sugiro verificar o tamanho da "Input" antes de efetuar a retirada destes caracteres especiais. Caso seja a última posição, basta não fazer nada...
     ... abaixo a solução:


                    If Input.Length < Posicao_Caracter + 1 Then

                        If Char.IsWhiteSpace(Input.Substring(Posicao_Caracter + 1, 1)) AndAlso Char.IsLower(Input.Substring(Posicao_Caracter + 2, 1)) Then

                            Monta_String = String.Concat(Monta_String, sChar & " " & Input.Substring(Posicao_Caracter + 2, 1).ToUpper(CurrentCulture))


                            i += 2
                            Exit Select

                        End If

                    End If



    É isto?!?


[]'s,
Tunusat.

Haja, pois, o que houver, ampliem-se obstáculos, agigantem-se problemas, intensifiquem-se lutas ou se agravem provações, trabalha sempre no bem de todos, porque, trabalhando na Seara do Bem, podes conservar a certeza de que Deus te sustentará. Emmanuel.

#430557 - 30/10/2013 19:48:10

PROGRAMADORVB6
LISBOA
Cadast. em:Janeiro/2004


Última edição em 30/10/2013 19:52:41 por PROGRAMADORVB6

Olá Tunusat.
Obrigado desde já pela sua resposta.
Mas a solução indicada, não resolve o meu problema.
O que eu pretendo é que ao escrever : o colega Tunusat está me ajudando. mas está a ser complicado!talvez encontrar a solução?
Tratar String ==> O colega Tunusat está me ajudando. Mas está a ser complicado! Talvez encontrar a solução?


______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.


#430564 - 31/10/2013 00:56:05

GANDA_NICK
LISBOA
Cadast. em:Setembro/2005


Olá,

fiz umas alterações no teu code e adicionei uma função para retirar espaços a mais que tinha achado na net..

porem penso que esta solução não está perfeita, acho que será mais facil ir por "etapas":
- Remover todos os espaços a mais (ex: espaços duplos)
- Remover todos os espaços antes e depois das pontuações
- Substituir por letra maiúscula a letra a seguir as pontuações excepto a virgula
- Adicionar espaço a seguir às pontuações


Segue o code:

Public Class Form1

    Private Function RemoveExtraWhitespace(ByVal _string As String) As String
        If (_string = Nothing Or _string = " ") Then
            Return Nothing
        End If
        _string = _string.Trim()
        Dim stringArray() As String = _string.Split(" ")
        Dim tempString As String = Nothing
        For Each stringElement In stringArray
            If (stringElement <> "") Then
                tempString += " " + stringElement
            End If
        Next
        tempString = tempString.Trim
        Return tempString
    End Function

    Private Function Formatar_Texto(ByVal Input As String) As String
        Dim Monta_String As String = String.Empty
        Dim sChar As String = ""
        Dim i As Integer, c As Integer = 1

        ' Remove mais de um espaço em branco seguidos
        Input = RemoveExtraWhitespace(Input)

        If Input = String.Empty Then Return String.Empty

        ' Primeira letra para maiuscula
        Input = Char.ToUpper(Input(0)) & Input.Substring(1)

        For i = 0 To Input.Length - 2
            sChar = Input.Substring(i, 1)
            Select Case sChar
                Case ".", "?", "!"
                    If Not Char.IsWhiteSpace(Input.Substring(i + 1, 1)) Then c = 1 Else c = 2

                    Monta_String = String.Concat(Monta_String, sChar & " " & Input.Substring(i + c, 1).ToUpper())
                    i += c

                Case Else
                    Monta_String = String.Concat(Monta_String, sChar.ToString())
            End Select
        Next

        ' Adiciona ultimo caracter porque o FOR é até Input.Length - 2
        Monta_String = String.Concat(Monta_String, Input.Substring(Input.Length - 1, 1))

        Return Monta_String

    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(Formatar_Texto("o colega Tunusat está me ajudando. mas está a ser complicado!talvez encontrar a solução ?"))
    End Sub

End Class




Avisa aí o que vai decidir fazer

Té+



________________________________________________
Não hÃÆ’á duvidas?? If Not (Duvidas) Then Encerre seu tópico

#430567 - 31/10/2013 08:02:50

TUNUSAT
SAMPA
Cadast. em:Dezembro/2003


PROGRAMADORVB6,


   Testei agora o que o Ganda_Nick montou e está perfeito, pode testar na sua máquina que vai funcionar 100%.

   Obrigado Ganda_Nick!

   Curti o que você postou sobre márca d'água. Vou montar um código usando aquele código.


Valew! T+!
[]'s,
Tunusat.

Haja, pois, o que houver, ampliem-se obstáculos, agigantem-se problemas, intensifiquem-se lutas ou se agravem provações, trabalha sempre no bem de todos, porque, trabalhando na Seara do Bem, podes conservar a certeza de que Deus te sustentará. Emmanuel.

#430580 - 31/10/2013 10:44:31

PROGRAMADORVB6
LISBOA
Cadast. em:Janeiro/2004


Última edição em 31/10/2013 11:51:10 por PROGRAMADORVB6

Olá Colega GANDA_NICK.
Obrigado desde já pela sua ajuda.
Tive a experimentar o código e funciona como o colega TUNUSAT diz a 100% , porém noto que quando o caracter se repete
existe a separação na mesma, isto é quando escrevemos :
- O colega GANDA_NICK e Tunusat estão me ajudando. Mas está a ser complicado... talvez conseguiremos encontrar a solução?
Ele não faz a destinção dos (...) , a solução talvez passe por, não fazer qualquer alteração caso o caracter anterior seja igual presente.

Para a supressão de espaços fiz esta Função:

Public Function ExcessoNo_Texto(Meu_Texto As String) As String
        Do While (Meu_Texto.IndexOf("  ") <> -1)
            Meu_Texto = Meu_Texto.Replace("  ", "")
        Loop
        Return Meu_Texto
    End Function  


Desde já agradeço a todos a vossa colaboração.

______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.


#430588 - 31/10/2013 12:25:22

GANDA_NICK
LISBOA
Cadast. em:Setembro/2005


ainda não está a 100%, o melhor era mesmo tirar os espaços antes das pontuções.... ve com a segunda frase,

usei essa sua função para tirar por exemplo duas pontuações seguidas (!!)

e já está a ficar badalhoco o code

Public Class Form1

    Public Function ExcessoNo_Texto(ByVal Meu_Texto As String, ByVal Caracter As Char) As String
        Do While (Meu_Texto.IndexOf(Caracter & Caracter) <> -1)
            Meu_Texto = Meu_Texto.Replace(Caracter & Caracter, Caracter)
        Loop
        Return Meu_Texto.Trim()
    End Function

    Private Function Formatar_Texto(ByVal Input As String) As String
        Dim Monta_String As String = String.Empty
        Dim sChar As String = ""
        Dim i As Integer, c As Integer = 1

        ' Trata reticencias, mais de 3 pontos assume 3 pontos
        Input = Input.Replace("...", "☻")
        Do While (Input.IndexOf("☻.") <> -1)
            Input = Input.Replace("☻.", "☻")
        Loop

        ' Remove mais de um espaço em branco seguidos e pontuações seguidas
        Dim Caracteres As String = "☻!?., "
        For i = 0 To Caracteres.Length - 1
            Input = ExcessoNo_Texto(Input, Caracteres.Substring(i, 1))
        Next

        If Input = String.Empty Then Return String.Empty

        ' Primeira letra para maiuscula
        Input = Char.ToUpper(Input(0)) & Input.Substring(1)

        For i = 0 To Input.Length - 2
            sChar = Input.Substring(i, 1)
            Select Case sChar
                Case ".", "?", "!", "☻"
                    If Not Char.IsWhiteSpace(Input.Substring(i + 1, 1)) Then c = 1 Else c = 2

                    Monta_String = String.Concat(Monta_String, sChar & " " & Input.Substring(i + c, 1).ToUpper())
                    i += c

                Case Else
                    Monta_String = String.Concat(Monta_String, sChar.ToString())
            End Select
        Next

        ' Adiciona ultimo caracter porque o FOR é até Input.Length - 2
        Monta_String = String.Concat(Monta_String, Input.Substring(Input.Length - 1, 1))

        ' Volta a meter as reticencias
        Monta_String = Monta_String.Replace("☻", "...")

        Return Monta_String

    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(Formatar_Texto("o colega Tunusat está me ajudando........ mas está a ser complicado!!talvez encontrar a solução.."))
        MsgBox(Formatar_Texto("o colega Tunusat está me ajudando.... .... mas está a ser complicado! !talvez encontrar a solução.."))
    End Sub

End Class


________________________________________________
Não hÃÆ’á duvidas?? If Not (Duvidas) Then Encerre seu tópico

#430597 - 31/10/2013 14:05:30

PEGUDO
RIO DE JANEIRO
Cadast. em:Março/2009


Cara,
Tenta isso aí:


"Às vezes, para poder andar pra frente, o homem deve deixar tudo para trás"

#430608 - 31/10/2013 19:09:26

PROGRAMADORVB6
LISBOA
Cadast. em:Janeiro/2004


Última edição em 31/10/2013 19:10:40 por PROGRAMADORVB6

 Anexos estao visíveis somente para usuários registrados

Olá Pegudo.
Estive a experimentar seu código e também não deu certo, veja a simulação.


______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.


#430643 - 01/11/2013 13:37:07

PEGUDO
RIO DE JANEIRO
Cadast. em:Março/2009


Última edição em 01/11/2013 13:38:08 por PEGUDO

Você esqueceu de colocar
str = trabalho(Vetor)
antes de  
MsgBox(str)
. Mas como eu vi que sua frase pode conter caracteres repetidos, faça as alterações a seguir, as outras não precisa mexer:




"Às vezes, para poder andar pra frente, o homem deve deixar tudo para trás"

#430666 - 01/11/2013 19:48:53

PROGRAMADORVB6
LISBOA
Cadast. em:Janeiro/2004


 Anexos estao visíveis somente para usuários registrados

Olá PEGUDO.
Desde já quero agradecer a sua colaboração.
Neste exemplo que mostrou aqui, ele mete em letra grande e repete logo a seguir o mesmo caracter em letra pequena, e também não está fazendo caso encontre na string a repetição dos caracteres (...) | (???) | (!!!) estes caracteres ficarão na mesma e também o caracter que virá posterior não sofrerá qualquer alteração.
Ex: O Colega PEGUDO está também me ajudando. Mas esta a ser difícil... talvez seja na próxima!!!

Junto envio o anexo para ver como fica.
Obrigado a todos por tudo + 1 vez

______________________________________________________________________________

Que minha coragem seja maior que meu medo e que minha força seja tão grande quanto minha fé.


 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por PROGRAMADORVB6 em 04/11/2013 20:31:36