ERC20 explicitly says:
Note Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event.
Yet, your code return false on 0 and do not call Transfer event.
if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0) {
I guess, it is not fully ERC20 compatible then.