none
Split RRS feed

  • Pergunta

  • Boa Tarde Pessoal!!!

    Seguinte eu estou usando split no meu código e gostaria de saber comoe u faço para pegar o espaço que tem ao lado do delimitador.

    Fico no aguardo!!!

    \0/

    terça-feira, 3 de dezembro de 2013 17:04

Respostas

  • Que isso estamos ai pra isso. 

    É justamente pra isso que existe o forum. 

    Abraço.


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    • Marcado como Resposta Jaque JK quinta-feira, 5 de dezembro de 2013 15:37
    quinta-feira, 5 de dezembro de 2013 13:57

Todas as Respostas

  • Não entendi sua pergunta, como assim o espaço ao lado do limitador?


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    terça-feira, 3 de dezembro de 2013 17:13
  • Digamos

    lalalala[46446546]   lalalalalalala

    Ta vendo o espaço depois do ( ] )?

    É isso, esses espaços cmo eu faço para o split pegar?

    terça-feira, 3 de dezembro de 2013 17:36
  • Jaque, eu nunca vi ninguém querendo recuperar o "" da string. 

    O split você utiliza para dividir uma string em array digamos assim. 

    Por exemplo, se você fizer texto.split(""); ele vai quebrar sempre que encontrar um espaço vazio na string.

    Que mal eu pergunte, porque você necessita recuperar tal espaço?

    Segue um link da Classe String: http://msdn.microsoft.com/pt-br/library/system.string(v=vs.110).aspx

    Caso você não queira tirar os espaços em branco não utilize o Trim().

    Abraço.


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs


    terça-feira, 3 de dezembro de 2013 17:51
  • Fernando,

    Acontece o seguinte, eu tenho um cheboxlist e nele tem este select 

    SELECT SchoolID, ProductID, ProductTypeID,  Price, Active, (Name + ' R$ ' + CAST(Price AS varchar

    Como tu pode ver os checks do meu checkboxlist estão vindo com o Nome e Preço do produto, mas eu preciso comar todos os valores  dos checks que o usuário selecionar. Esta mais ou menos como abaixo:

    [ ]Pera R$: 1,50

    [ ]uva R$: 1,58

    [ ]Laranja R$: 1,05

    [ ]Pera R$: 2,50

    Quando o usuário clicar o value do check esta com o valor do nome e do preço.

    Ai eu usei o slip com o delimitador R$, mas no banco a soma esta saindo com outro formato e eu acho que é por causa do espaço,

    ao invés de ficas 1,50 esta 150,00 entendeu?

    Quero testar para ver se é isso:

    Segue o código para ti dar uma olhada

    for (int i = 0; i < ckProducts.Items.Count; i++)
                {
                    int ProductID = Convert.ToInt32(ckProducts.Items[i].Value);
    
                  //  if (lista.Exists(i => ProductID == ProductID)){
                        if (ckProducts.Items[i].Selected)
                        {
    
                            lista.Add(Convert.ToInt32(ckProducts.Items[i].Value));
                            
                            
                            string preco = ckProducts.Items[i].Text;
                            string[] separador = new string[] { "R$ "};
                            string[] resultado = preco.Split(separador, StringSplitOptions.None);
    
                           string valorPreco = null;
                            if (resultado.Length == 2)
                            {
                                valorPreco = resultado[1];
                            }
                            
    
                            Sum = Sum + float.Parse(valorPreco);
                            B.Combo obj = new B.Combo(SchoolID, ComboID, (Convert.ToInt32(ckProducts.Items[i].Value)), txtName.Text, decimal.Parse(Sum.ToString()));
                            B.Combo.Save(obj);
    
                           // ClearForm();
                         
                        }
    
                  //  }
                         
    
                 }
            }

    terça-feira, 3 de dezembro de 2013 18:06
  • Jaque agora entendi. 

    Então isso não se dá por conta do espaço não, mas sim pelo tipo de dado.

    Para você retirar os espaços em branco utilize o Trim() (com o split você não irá conseguir), exemplo:

    string teste = campoTexto.ToString().Trim();

    Vi que no seu código o campo é String, mas no banco é string ou decimal?

    Suspeito que seja Decimal correto?

    O que eu faria nesse caso seria formatar ele corretamente antes de enviar para o Banco. 

    Acho que se você efetuar uma formatação antes de enviar para o banco sua soma ficará correta. 

    http://social.msdn.microsoft.com/Forums/pt-BR/0fb347d7-445e-453b-99da-5020099459f1/formatar-campo-decimal

    http://www.varois.net/2013/01/formatando-decimais-em-c/

    Mais ou menos assim:

    valor = string.Format("{0:#,##0.00}", double.Parse(itemArray));

    O link esta aqui:http://stackoverflow.com/questions/15473216/how-to-format-a-windows-forms-textbox-with-thousand-separator-and-decimal-separt

    Espero que agora consiga resolver o seu problema. 

    Abraço.


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    terça-feira, 3 de dezembro de 2013 18:37
  • Fernando, 

    Que resposta legal.

    Mas eu fiquei meio perdida, até tentei aqui, mas não consegui.

    Tu pode dar um exemplo dentro do que tu já conhece do meu código?

    Criei uma variável para por o string.format, mas eu mão sabia qual tipo declarar para a variável, pois tem dois tipos desntro do string.format e tipo que esta no banco é decimal ai da erro de parâmetro.

    Tentei colocar direto no new, mas não deu certo tb.

    Onde devo colocar?Como?

    terça-feira, 3 de dezembro de 2013 19:33
  • Sua variável deve ser do tipo Decimal igual a existente no banco. 

    ficaria mais ou menos assim:

    decimal valorPreco = 0;
    if (resultado.Length == 2)
    {
        valorPreco = string.Format("{0:#,##0.00}", decimal.Parse(resultado[1]));
    }

    Coloque um ponto de debug e veja se o valorPreco irá ficar da forma que você espera. 

    Se acaso ocorrer algum erro, tente trocar a ',' por '.' se não me engano o decimal entende invertido rs. 

    trocar virgula por ponto: decimal.Parse(resultado[1].ToString().Replace(",","."));


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs




    terça-feira, 3 de dezembro de 2013 19:45
  • Fernando,

    Eu coloquei onde tu me explicou, mas continuou da emsma forma.

    Por que é o seguinte, até a fórmula da soma o formato está normal, mas quando chega na linha do add ele fica com outro formato.

     B.Combo obj = new B.Combo(SchoolID, ComboID, (Convert.ToInt32(ckProducts.Items[i].Value)), txtName.Text, decimal.Parse(Sum.ToString()));

    É na linha acima que o valor aparece errado.

    quarta-feira, 4 de dezembro de 2013 16:03
  • Jaque, o valor da soma você esta definindo como decimal correto?

    Se a sua variável for decimal, não tem a necessidade de você fazer o decimal.Parse(Sum.ToString())...

    Quando você for passar para o banco você irá utilizar a variável que você formatou... 

     B.Combo obj = new B.Combo(SchoolID, ComboID, (Convert.ToInt32(ckProducts.Items[i].Value)), txtName.Text, valorSoma);

    É bem provável que o ToString() ta zuando a máscara. 

    Teste dessa maneira, vou ver se faço alguns testes aqui. 

    Abraço.


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    quarta-feira, 4 de dezembro de 2013 16:12
  • Jaque conforme dito efetuei os testes:

    Segue o código. 

    decimal valor = 0;
    string valorTeste = "265,32";
    
    valor = Convert.ToDecimal(string.Format("{0:#,##0.00}", decimal.Parse(valorTeste)));
    
    Console.WriteLine("O valor correto é: " + decimal.Parse(valor.ToString()));

    Mesmo com o ToString ele apareceu corretamente o valor 265,32.

    Outra forma é essa, onde mesmo que o número for inteiro ele adiciona duas casas decimais:

    decimal valor = 0;
    int valorTeste = 26532;
    
    valor = Convert.ToDecimal(valorTeste.ToString(@"#\,##", CultureInfo.InvariantCulture));
    
    Console.WriteLine("O valor correto é: " + decimal.Parse(valor.ToString()));
    Lembrando, estou passando diretamente minha variável formatada. 


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    quarta-feira, 4 de dezembro de 2013 16:31
  • Fernando,

    Assim?

    decimal valorPreco = 0;
                                if (resultado.Length == 2)
                                {
                                   // valorPreco = resultado[1];
                                    valorPreco = string.Format("{0:#.##0,00}", decimal.Parse(resultado[1].ToString().Replace(",", ".")));
                                }
    
                                Sum = Sum + decimal.Parse(valorPreco);
                                B.Combo obj = new B.Combo(SchoolID, ComboID, (Convert.ToInt32(ckProducts.Items[i].Value)), txtName.Text, decimal.Parse(Sum.ToString()));


    Se sim, fica dando este erro:

    Error	5	Cannot implicitly convert type 'string' to 'decimal'	D:\TFS\IASD.ASCS\IASD.ASCS.WebForm\register\combos\Default.aspx.cs	121	46	IASD.ASCS.WebForm
    

    Por que o valor que vem da lista é string.

    E quando eu deixou do outro jeito(o jeito que estou usando)

    string valorPreco = null;
                                if (resultado.Length == 2)
                                {
                                   // valorPreco = resultado[1];
                                    valorPreco = string.Format("{0:#.##0,00}", decimal.Parse(resultado[1].ToString().Replace(",", ".")));
                                }
    
                                Sum = Sum + decimal.Parse(valorPreco);
                                B.Combo obj = new B.Combo(SchoolID, ComboID, (Convert.ToInt32(ckProducts.Items[i].Value)), txtName.Text, decimal.Parse(Sum.ToString()));
                                B.Combo.Save(obj);

    Não dá erro, mas os valores da soma ficam com o formato errado.

    quarta-feira, 4 de dezembro de 2013 18:18
  • O campo valorPreco fica com a máscara correta né?

    Veja se após efetuar a soma o Sum está formatado corretamente.

    Caso não adicione a mascara também para esse campo.

    Sum = Convert.ToDecimal(string.Format("{0:#.##0,00}", Sum) + decimal.Parse(valorPreco);

    Quanto ao erro você fez o replace correto, mas eu confirmei aqui e o decimal é virgula mesmo e não ponto. 

    Efetuei um teste aqui com a linha de código que você passou e ocorreu tudo certo. 

    string valorTeste = "265,32";
    decimal Sum = 220.50M;
    
    Sum = Sum + decimal.Parse(valorTeste);
               
    Console.WriteLine("O valor correto é: " + Sum);
    Assim também deu certo: 
    string valorTeste = "15,50";
    decimal Sum = 0;
    
    for (int i = 0; i < 3; i++)
    {
         Sum = Sum + decimal.Parse(valorTeste); 
    }

    Qual valor era pra ser apresentando por exemplo na sua primeira linha?

    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    quarta-feira, 4 de dezembro de 2013 18:45
  • Fernando,

    Fiz como você me disse e tive uma surpresa..rsrs

    quarta-feira, 4 de dezembro de 2013 19:28
  • Qual valor que vinha no campo antes da formatação?

    Eu vi que você comentou o trecho onde você mascarava o campo valorPreco, não precisa, deixa ele com a mascara, apenas retire o Replace.

    Vem debugando desde o inicio do if do resultado e validando o valor do campo valorPreco. 

    Se ele tive com o valor inteiro você terá de usar a mascara para inteiro. 

    Na proxima resposta poste esse trecho de codigo que amanha cedo eu vejo rs. 

     



    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs


    quarta-feira, 4 de dezembro de 2013 19:54
  • Bom dia Fernando!

    Seguem algumas imagens para entenderes melhor o que etá acontecendo.

    quinta-feira, 5 de dezembro de 2013 09:24
  • quinta-feira, 5 de dezembro de 2013 09:26
  • Bom Dia Jaque. 

    Ja estou vendo aqui. 

    E já encontrei o erro. 

    Quando você pega seu valor string valorPreco e converte para decimal, ele esta zuando a máscara. Outra coisa o valor tem que vir com virgula e não com ponto exemplo: 

    Ao invés de vir 3.00 tem que ser 3,00, a máscara quando é 3.00 ela coloca 300,00 e quando vem com virgula ela mantem o 3,00, e se acaso vir apenas 3 ela ira colocar 3,00 entendeu? 

    Estou tentando resolver o problema da soma Jaque, que é onde o valor esta perdendo a máscara. 


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    quinta-feira, 5 de dezembro de 2013 11:14
  • Jaque, fiz alguns testes e algumas pesquisas. 

    Primeiro te aconselho a colocar uma máscara no campo onde o valor é preenchido, provável textBox, adicionando vírgula ao invés de ponto. 

    Esse valor você pega e joga no seu campo decimal para efetuar a soma necessária exemplo: 

    string valorTeste = "3.100,15";
    decimal Sum = 0;
    string valor = null;
        
    // Utilizei for para efetuar a soma       
    for (int i = 0; i < 2; i++)
    {
       // quando você faz a conversão para decimal, o valor
       // 3.100,15 fica 3100,15 mas a soma fica correta 
       // 6200,30
       Sum =  Sum +  decimal.Parse(valorTeste);    
    }

    Feito isso você irá efetuar a máscara para gravar no banco certinho, utilizando um campo string para receber tal valor e no seu banco esse campo sera varchar ao invés de decimal. 

    valor = string.Format("{0:n}", Sum);

    Com o código acima o valor 6200,30 irá ficar certinho 6.200,30. 

    Espero que tenha entendido, e que agora resolva seu problema rs. 



    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    quinta-feira, 5 de dezembro de 2013 11:44
  • Fernando,

    Obrigada por estar me ajudando!

    Mas olha só o que apareceu do nada.

    quinta-feira, 5 de dezembro de 2013 11:48
  • Essa linha de código irá sumir Jaque. 

    Você entendeu a minha ultima postagem?


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    quinta-feira, 5 de dezembro de 2013 11:56
  • Sim, desculpe eu só vi quando atualizei a página.

    Então, eu fiz, mas o valor final do Sum ao invés de ficar 6,00 ficou 600.

    Então sobre o ponto é o seguinte os valores estão sendo puxados no banco e lá eles estão com (,), mas quando passa no split fica com ponto.

    

    quinta-feira, 5 de dezembro de 2013 12:09
  • Jaque, tire a mascara do valorPreco. 

    Descomente a linha onde ele recebe o valor do resultado[1] e comente onde você adiciona a máscara(linha de baixo). 

    Caso o campo esteja com ponto, faça o seguinte:

    valorPreco = resultado[1].Replace(".",",");

    Engraçado o Split trocar. 

    Ele fica 600 justamente por causa do .

    Verifique se quando você efetuar a soma o seu valor Sum vai estar 6 ou 6,00. 


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs


    quinta-feira, 5 de dezembro de 2013 12:42
  • Coloquei como tu pediu.

    Ficou 6

    quinta-feira, 5 de dezembro de 2013 12:49
  • Jaque poste seu codigo pra mim fica mais facil pra eu ver o que esta acontecendo 


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    quinta-feira, 5 de dezembro de 2013 12:55
  • protected void btnSave_Click1(object sender, ImageClickEventArgs e)
            {
                int ComboID = 0;
                if (hfComboID.Value != "")
                    ComboID = int.Parse(hfComboID.Value);
    
                int SchoolID = int.Parse(ddlSchool.SelectedValue);
               
                    for (int i = 0; i < ckProducts.Items.Count; i++)
                    {
                      int ProductID = Convert.ToInt32(ckProducts.Items[i].Value);
                     //  if (lista.Exists(check => check != ProductID))
                     // {
    
                            if (ckProducts.Items[i].Selected)
                            {
    
                                lista.Add(Convert.ToInt32(ckProducts.Items[i].Value));
    
    
                                string preco = ckProducts.Items[i].Text;
                                string[] separador = new string[] { "R$" };
                                string[] resultado = preco.Split(separador, StringSplitOptions.None);
    
                                string valorPreco = null;
                                if (resultado.Length == 2)
                                {
                                    valorPreco = resultado[1].Replace(".",",");
                                   // valorPreco = string.Format("{0:#.##0,00}", decimal.Parse(resultado[1].ToString()));
                                }
    
    
                                // Sum = Convert.ToDecimal(string.Format("{0:#.##0,00}", Sum) + decimal.Parse(valorPreco));
                                Sum = Sum + decimal.Parse(valorPreco);
                              //  valor = string.Format("{0:n}", Sum);
                               // VALOR = Convert.ToDecimal(string.Format("{0:#.##0,00}", Sum));
                                B.Combo obj = new B.Combo(SchoolID, ComboID, (Convert.ToInt32(ckProducts.Items[i].Value)), txtName.Text, Sum);
                                B.Combo.Save(obj);
    
    
                                //valorPreco = string.Format("{0:#,##0.00}", decimal.Parse(resultado[1]));
                                //decimal.Parse(resultado[1].ToString().Replace(",","."));
    
    
                            }
    
                        }
    
    
               //  }
    
            
            }

    quinta-feira, 5 de dezembro de 2013 13:06
  • Fernando,

    Tenho boas novas..rsrs

    Olha só, a vírgula apareceu no lugar certo agora, mas tem zero sobrando.

    quinta-feira, 5 de dezembro de 2013 13:20
  • Acho que já sei. 

    Deixe assim:

    if (resultado.Length == 2) valorPreco = resultado[1].Replace(".",","); Sum = Sum + decimal.Parse(valorPreco); valor = string.Format("{0:n}", Sum);

    // Valide se o valor esta formatado de forma correta B.Combo obj = new B.Combo(SchoolID, ComboID, (Convert.ToInt32(ckProducts.Items[i].Value)), txtName.Text, valor); B.Combo.Save(obj);


    Você alterou seu banco para o campo da soma ser do tipo varchar? 


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    quinta-feira, 5 de dezembro de 2013 13:20
  • Não!

    No banco mesmo ele está como money, mas aqui nas classes e no método ele está como decimal.

    Vou testar agora o que tu passou ;)

    quinta-feira, 5 de dezembro de 2013 13:30
  • Fernando!!!!!!!!

    Deu certooooooooooo!!!!!!!!!

    Obrigada!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Mas pq deu certo com o {0:n}  ??

    O que exatamente ele fez?

    quinta-feira, 5 de dezembro de 2013 13:38
  • O {0:n} é uma formatação de máscara.

    É o seguinte não foi só ele sozinho rs, a máscara para valor ela é aplicada corretamente na string, quando você converte ela para decimal ela perdia a mascara, por isso do erro. 

    Como mantivemos o valor como string, apenas utilizamos ele decimal na hora de fazer a soma quando jogamos a máscara para o campo string ela aplica certinho. 

    Nesse link tem vários tipos de mascaras: https://sites.google.com/site/tecguia/formatar-string-c-string-format.

    Que bom que resolveu.

     

    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    quinta-feira, 5 de dezembro de 2013 13:49
  • Muito Obrigada viu!!!!

    Tu não quebrou um galho, foi uma árvore mesmo...rsrsr

    Obrigada de coração!!!!!!!!!!

    quinta-feira, 5 de dezembro de 2013 13:55
  • Que isso estamos ai pra isso. 

    É justamente pra isso que existe o forum. 

    Abraço.


    Voce pode encarar um erro como uma besteira a ser esquecida, ou como um resultado que aponta uma nova direcao by Steve Jobs

    • Marcado como Resposta Jaque JK quinta-feira, 5 de dezembro de 2013 15:37
    quinta-feira, 5 de dezembro de 2013 13:57